我通过这个命令在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> ();
答案 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()