Python 子进程模块在运行 UNIX 命令时提供 OSError



这是上下文:我正在使用python 2.7.5。我想在python脚本中运行UNIX命令以及maven命令。我成功地这样做了,使用 os.system("cmd") ,但我需要处理给定命令的结果。在阅读了这里的文档和一些线程后,我决定使用子流程模块使用 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中查看了给定的脚本,但没有学到比错误消息中提到的更多内容:提高child_exception子处理终端输出

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

此外,subprocess.call函数不会捕获已执行命令的输出,因此仅当您希望以交互方式运行脚本的用户看到ls /usr(或其他任何内容)的输出时,才会使用它。(这与os.system几乎相同。

试试这个(显示带和不带外壳):

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 )。

最新更新