Python子进程:如何检索标准输出

时间:2013-03-29 15:56:53

标签: python redirectstandardoutput

所以,我正在编写一个python脚本,我需要在其中调用另一个在标准输出中打印几行的python脚本。我想将callee脚本的输出存储在列表中,并在主脚本中处理它们。

一种简单的方法是将结果打印到文件(file3)中并读取文件,如此

subprocess.call("./vecdiff.py file1 file2 > file3")

f = open("file3", "r")

如何将输出直接重定向到主脚本中的某些列表?

4 个答案:

答案 0 :(得分:3)

最简单的方法是调用subprocess.check_output调用进程并返回其输出(或者在非零返回代码上引发异常,但你仍然可以通过异常访问输出宾语)。它可以轻松处理STDOUTSTDERR(默认情况下仅STDOUT)。

手册中的示例:

>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'

如果您的流程生成了大量数据,并且您希望在其运行时对其进行处理,则必须打开管道并使用其他答案中所述的communicate

答案 1 :(得分:2)

如下所示,将子进程的stdout和stderr重定向到PIPE,然后可以使用'communic()'方法从PIPE获取子进程的stdout和stderr。 'PIPE'是父进程和子进程之间的管道。

from subprocess import Popen, PIPE
p = Popen("./vecdiff.py file1 file2", stdout=PIPE, stderr=PIPE)
output, errput = p.communicate()

答案 2 :(得分:1)

如果您使用subprocess.Popen(),则可以使用communicate()保存输出。例如:

proc = subprocess.Popen("./vecdiff.py file1 file2", stdout=subprocess.PIPE)
output = proc.communicate()

答案 3 :(得分:0)

使用plumbum轻松完成:

from plumbum.cmd import python
cmd = python['./vecdiff.py']['file1', 'file2']
for line in cmd().splitlines():
    print line