子进程返回一个空字符串

时间:2017-10-17 08:38:49

标签: python bash

我想在Python脚本中检查Bash命令的结果。 我正在使用subprocess.check_output()

在此之前,我手动检查了shell中两个命令的结果:

user@something:~$ hostname
> something

user@something:~$ command -v apt
> /usr/bin/apt

它按预期工作。现在我正在尝试在Python解释器中运行subprocess.check_output()函数:

>>> import subprocess
>>> subprocess.check_output(['hostname'], shell=True, stderr=subprocess.STDOUT)
b'something\n'
>>> subprocess.check_output(['command', '-v', 'apt'], shell=True, stderr=subprocess.STDOUT)
b''

如您所见,第一个命令按预期工作,但不是第二个命令(因为它返回一个空字符串)。这是为什么?

修改

我已尝试删除shell=True,但会返回错误:

>>> subprocess.check_output(['command', '-v', 'apt'], stderr=subprocess.STDOUT)
Traceback (most recent call last):
[...]
FileNotFoundError: [Errno 2] No such file or directory: 'command'

1 个答案:

答案 0 :(得分:0)

从参数中删除shell=True

>>> subprocess.check_output(['command', '-v', 'apt'], stderr=subprocess.STDOUT) 
'/usr/bin/apt\n'

请参阅Actual meaning of 'shell=True' in subprocess

  

如果shellTrue,建议将args作为字符串传递   而不是一个序列。

这可以确保命令的格式正确,如果您直接在shell中键入命令一样:

>>> subprocess.check_output('command -v apt', shell=True, stderr=subprocess.STDOUT)
'/usr/bin/apt\n'

但是,通常不鼓励使用shell