如何在python中的子进程调用期间使用stdout = subprocess.PIPE时获取正常的print语句执行

时间:2015-07-09 15:06:02

标签: python subprocess stdout

我通过这个命令在python中启动subprocess

result = subprocess.Popen([sys.executable, "/subscript.py"] + parameter,stdout=subprocess.PIPE )
result.wait()
out, err = result.communicate()
for line in out.splitlines():
    print line

我使用这种方法遇到的问题是print中的所有subscript.py语句都被缓冲到最后并且打印在terminal末尾的subscript.py执行。因此,如果我的terminal执行大约需要15分钟,那么15分钟subscript.py没有显示任何内容,一旦stdout=subprocess.PIPE执行结束,则所有打印语句一起打印。我知道这是因为subscript.py的使用,如果我删除它,那么我会得到我想要的但我无法删除它,因为我使用它从subscript.py获取变量的值(我在subscript.py中打印该变量,然后在父脚本中我将浏览每个打印以获取具有可变值的打印件。)

所以,我想要的是所有的print语句都应该在result = subprocess.Popen([sys.executable, "/subscript.py"] + parameter,stdout=subprocess.PIPE,bufsize=1) with result.stdout: for line in iter(result.stdout.readline, b''): print line, result.wait() 中遇到它们时打印,不需要任何缓冲,直到执行结束。有没有办法做到这一点?

更新我试图关注J.F. Sebastian's method,但我仍然得到相同的输出。来自子进程的打印被缓冲,一旦子进程结束,它们就被打印到终端。我更新的代码是:

HashMap<Integer,ArrayList<String>> = new HashMap<Integer,ArrayList<String>>(); 
ArrayList<constructor> frndList = new ArrayList<constructor> ();

1 个答案:

答案 0 :(得分:2)

您链接的答案只有在孩子中刷新stdout缓冲区后才打印任何内容,因为the answer itself中明确说明了这一点。

使用-u parameter,在Python子进程中取消缓冲stdout:

#!/usr/bin/env python2
import sys
from subprocess import Popen, PIPE

result = Popen([sys.executable, '-u', '/path/to/subscript.py'] + parameters, 
               stdout=PIPE, bufsize=1)
with result.stdout:
    for line in iter(result.stdout.readline, b''):
        print line,
result.wait()