如何子处理此 CLI 命令

How to subprocess this CLI command

我想使用 Python 获得此 shell 命令的输出:

loginctl show-session -p Display -p Active c2

输出为:

Display=:0
Active=yes

在Python中,我是这样做的:

import subprocess
subprocess.call(['loginctl', 'show-session -p Display -p Active c2'])

我收到这个错误:

Unknown operation show-session -p Display -p Active c2

可能是什么原因?

试试 shell = True:

import subprocess
subprocess.call('loginctl show-session -p Display -p Active c2', shell= True)

输出:

Display=:0
Active=yes
subprocess.call(['loginctl', 'show-session', '-p', 'Display', '-p', 'Active', 'c2'])

或者,如果您熟悉基本的 shell 拆分:

import shlex
cmd = 'loginctl show-session -p Display -p Active c2'
subprocess.call(shlex.split(cmd))

小心如果将用户输入直接发送到 str.splitshlex.split 并将结果与​​ subprocess 一起使用,很容易绕过。

添加 shell = True 也应该有效,但有很多副作用,请参阅 official docs and this Whosebug answer