Python子进程模块在运行UNIX命令时发出OSError

时间:2017-01-03 15:57:05

标签: python-2.7 maven unix subprocess

以下是上下文: 我使用的是python 2.7.5。我想在python脚本中运行UNIX命令以及maven命令。 我使用os.system("cmd")成功完成了这项工作,但我需要处理给定命令的结果。在阅读了doc和这里的一些线程后,我决定使用子进程模块使用PIPE将输出重定向到stdout。出乎意料的是,我收到了一个OSError,如附图中所示。非常感谢您的帮助。 除了附图中的给定样本外,我还尝试过:

p = os.popen("java -version")
result = subprocess.check_output(p, shell=True)
subprocess.call("ls /usr", shell=True)
p.s. Using shell=True is strongly discouraged (doc), since it can be dangerous when coupled with unsanitized input. 

另外,我在错误消息/usr/lib64/python2.7/subprocess.py, line 711 adn 1327中查看了给定的脚本,但没有学到错误消息中提到的内容:raise child_exception Subprocess Terminal Output

1 个答案:

答案 0 :(得分:1)

您没有正确使用subprocess.check_output。您正在尝试将管道文件对象(返回值os.popen)传递给check_output,但它期望一个命令参数或参数向量。

此外,subprocess.call函数不会捕获已执行命令的输出,因此如果您希望运行该命令的用户看到ls /usr(或其他)的输出,则只能使用它。脚本交互式。 (这与os.system几乎相同。)

试试这个(显示有和没有shell):

import subprocess

out1a = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
print(out1a)

out1b = subprocess.check_output('java -version', stderr=subprocess.STDOUT, shell=True)
print(out1b)

out2a = subprocess.check_output(['ls', '/usr'])
print(out2a)

out2b = subprocess.check_output('ls /usr', shell=True)
print(out2b)

# Cannot capture output this way, but it will be visible to user
subprocess.call('ls /usr', shell=True)

请注意,在java -version命令的情况下,版本信息将打印到命令的标准错误输出,因此您必须重定向它才能将其捕获为check_output的返回值(因此stderr=subprocess.STDOUT)。