以下是上下文:
我使用的是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
答案 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
)。