Kri*_*ish 4 python subprocess stdout python-2.7
有两个程序 - parent.py和myscript.py,如下所示.parent.py在控制台中保持打印消息.并且myscript.py需要访问parent.py打印的内容.
parent.py:
import time
while 1:
time.sleep(1)
print "test"
Run Code Online (Sandbox Code Playgroud)
myscript.py:
import subprocess
p = None
p = subprocess.Popen(['python', 'parent.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
for line in p.stdout:
print line
Run Code Online (Sandbox Code Playgroud)
我希望myscript.py动态地捕获parent.py的输出.可以看出,parent.py有一个无限循环 - 脚本永远不会停止,但每当它输出单词'test'时,myscript.py也应输出相同的内容.但myscript.py没有给出任何输出.
我尝试用parent替换parent.py中的代码
print "Hello"
Run Code Online (Sandbox Code Playgroud)
程序完成执行后,myscript.py也打印出"Hello".所以我想除非parent.py的执行完成,否则myscript.py不会读取它.那是什么事吗?
我也尝试用这个片段替换myscript.py中的循环:
for line in iter(p.stdout.readline, ''):
print line
Run Code Online (Sandbox Code Playgroud)
仍然没有输出.
我的问题是:即使parent.py永远不会完成执行,我如何让myscript.py动态读取parent.py正在打印的所有内容.
(我发现了类似的问题,但是它们要么不起作用,要么根本没有答案.)
这是一个块缓冲问题:当stdout被重定向到一个管道时,parent.py它会在内部缓冲区(~4K-8K)中累积它的输出,即,在缓冲区溢出之前,你将看不到任何大约一个小时的内容.
要禁用缓冲,请传递-u命令行选项:
#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE, STDOUT
script_path = os.path.join(get_script_dir(), 'parent.py')
p = Popen([sys.executable, '-u', script_path],
stdout=PIPE, stderr=STDOUT, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait()
Run Code Online (Sandbox Code Playgroud)
看到:
注意:如果您不需要对输出执行任何操作,那么只需删除stdout=PIPE,即可在控制台中查看输出:
subprocess.check_call([sys.executable, script_path])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6237 次 |
| 最近记录: |