这是上下文:我正在使用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
)。