用Python读取另一个程序的控制台输出
有两个程序-parent.py和myscript.py,如下所示。parent.py一直在控制台中打印消息。myscript.py需要访问parent.py打印的内容 parent.py:用Python读取另一个程序的控制台输出,python,python-2.7,subprocess,stdout,Python,Python 2.7,Subprocess,Stdout,有两个程序-parent.py和myscript.py,如下所示。parent.py一直在控制台中打印消息。myscript.py需要访问parent.py打印的内容 parent.py: import time while 1: time.sleep(1) print "test" import subprocess p = None p = subprocess.Popen(['python', 'parent.py'], stdo
import time
while 1:
time.sleep(1)
print "test"
import subprocess
p = None
p = subprocess.Popen(['python', 'parent.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
for line in p.stdout:
print line
myscript.py:
import time
while 1:
time.sleep(1)
print "test"
import subprocess
p = None
p = subprocess.Popen(['python', 'parent.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
for line in p.stdout:
print line
我希望myscript.py动态捕获parent.py的输出。可以看出,parent.py有一个无限循环——脚本永远不会停止,但每当它输出单词“test”时,myscript.py也应该输出相同的循环。但是myscript.py不会给出任何输出
我尝试将parent.py中的代码替换为
print "Hello"
由于程序执行完毕,myscript.py还打印了“Hello”。所以我想除非parent.py的执行完成,否则myscript.py不会读取它。这是怎么回事
我还尝试用以下代码片段替换myscript.py中的循环:
for line in iter(p.stdout.readline, ''):
print line
但仍然没有产出
我的问题是:如何让myscript.py动态读取parent.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()
见:
注意:如果您不需要对输出执行任何操作,只需拖放stdout=PIPE即可在控制台中查看输出:
subprocess.check_call([sys.executable, script_path])
作品另外,一个快速的问题(不确定这是一个快速的解决方法还是涉及到更复杂的方法):有可能通过运行程序实现同样的效果吗?我的意思是,在本例中-myscript.py执行parent.py,然后将输出返回给myscript。我希望提取已经运行的代码的控制台输出,并提取其输出。比如识别进程>获取进程id>从控制台获取输出。我应该单独问这个问题,还是可以调整脚本本身?@Krish:“已经在运行”案例(特别是当您无法控制流程如何启动时)是一个单独的问题:确保提供上下文和动机:您试图解决什么问题,以及为什么您认为拦截输出会有所帮助。