如何使用Python运行子进程,等待它退出并将完整的stdout作为字符串?

Stu*_*Cat 28 python subprocess

所以我注意到subprocess.call在继续使用python脚本之前它等待命令完成,我无法获得stdout,除了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"
Run Code Online (Sandbox Code Playgroud)

我的输出:

HIHIHI
Run Code Online (Sandbox Code Playgroud)

注意:我试图wine用这个运行.

Ale*_*lex 73

我正在使用以下构造,尽管您可能想要避免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
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这个,但我仍然得到空洞的结果:我不完全确定我做错了什么. (2认同)
  • `cmd`的内容是什么? (2认同)

Kat*_*iel 19

subprocess.check_output(...)
Run Code Online (Sandbox Code Playgroud)

调用进程,如果其错误代码非零,则引发进程,否则返回其stdout.这只是一个快速的简写,所以你不必担心PIPEs和事情.

  • 这是一个很棒的功能,但仅限于Python 2.7或更新版本. (3认同)

glg*_*lgl 14

如果你的进程提供了一个巨大的stdout而没有stderr,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
Run Code Online (Sandbox Code Playgroud)

可能是要走的路.

process.stdout 是一个类似文件的对象,您可以将其视为任何其他此类对象,主要是:

  • 你可以read()从它
  • 你可以readline()从它和
  • 你可以迭代它.

后者就是我上面要做的,以便逐行获取其内容.

  • @glglgl您可能需要将process(line)更改为do_something(line),以避免与您在第一行中设置的进程标识符/变量混淆。:) (2认同)