所以,我注意到subprocess.call
而它与python脚本继续之前等待命令完成,我没有得到标准输出,除了与方式subprocess.Popen
。 是否有任何替代函数调用会等到它完成? (我也试过Popen.wait
)
注:我试图避免os.system
调用
result = subprocess.Popen([commands...,
self.tmpfile.path()], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = result.communicate()
print out+"HIHIHI"
我的输出:
HIHIHI
注意:我试图运行wine
与此有关。
我使用的是下面的结构,虽然你可能想避免shell=True
。 这给你的任何命令的输出和错误信息,错误代码,以及:
process = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
out, err = process.communicate()
errcode = process.returncode
subprocess.check_output(...)
调用过程中,提出了如果它的错误代码是非零值,否则返回其标准输出。 这只是一个快速的简写,所以你不必担心PIPE
S和东西。
如果你的过程给出了一个巨大的标准输出和标准错误没有, communicate()
可能是错误的路要走由于内存限制。
代替,
process = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
# wait for the process to terminate
for line in process.stdout: do_something(line)
errcode = process.returncode
可能是要走的路。
process.stdout
是一个类似文件的对象,你可以把任何其他这样的对象,主要是:
- 你可以
read()
从它 - 你可以
readline()
从它, - 你可以通过它进行迭代。
后者是我为了通过一线得到它的内容做线以上。
我想尝试这样的:
#!/usr/bin/python
from __future__ import print_function
import shlex
from subprocess import Popen, PIPE
def shlep(cmd):
'''shlex split and popen
'''
parsed_cmd = shlex.split(cmd)
## if parsed_cmd[0] not in approved_commands:
## raise ValueError, "Bad User! No output for you!"
proc = Popen(parsed_command, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
return (proc.returncode, out, err)
......换句话说,让shlex.split()做的大部分工作。 我不会试图解析shell命令行中,找到管道运营商,并建立自己的管道。 如果你要做到这一点,那么你就基本上都要写一个完整的shell语法分析器,你会最终做一个可怕的很多管道的。
当然,这提出了一个问题,为什么不直接使用POPEN与外壳= TRUE(关键字)选项? 这将让你传递一个字符串(不分裂,也不解析)的外壳和仍然聚集起来的结果来处理如你所愿。 我的例子,这里将不再处理任何管道,反引号,文件描述符重定向等,可能是命令,他们会全部显示为文字形参的命令。 因此,它仍然是安全的,然后用shell中运行=真 ......我已经给反对某种形式的检查命令的傻例如“经认可的命令”字典或设置---通过它会更有意义正常化是成绝对路径,除非你打算要求的参数来之前,命令字符串传递给此功能恢复正常。
文章来源: How to run a subprocess with Python, wait for it to exit and get the full stdout as a string?