如何运行使用Python的子进程,等待它退出并获得完整的标准输出作为一个字符串?(How to ru

2019-07-03 20:42发布

所以,我注意到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与此有关。

Answer 1:

我使用的是下面的结构,虽然你可能想避免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


Answer 2:

subprocess.check_output(...)

调用过程中,提出了如果它的错误代码是非零值,否则返回其标准输出。 这只是一个快速的简写,所以你不必担心PIPE S和东西。



Answer 3:

如果你的过程给出了一个巨大的标准输出和标准错误没有, 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()从它,
  • 你可以通过它进行迭代。

后者是我为了通过一线得到它的内容做线以上。



Answer 4:

我想尝试这样的:

#!/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?