在 Python 中读取另一个程序的控制台输出
Read console output of another program in Python
有两个程序 - parent.py 和 myscript.py,如下所示。 parent.py 不断在控制台中打印消息。 myscript.py 需要访问 parent.py 打印的内容。
parent.py:
import time
while 1:
time.sleep(1)
print "test"
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
我希望 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 永远不会完成它的执行。
(我发现了类似的问题,但它们要么不起作用,要么其中一些根本没有答案。)
它是一个 block buffering issue:当 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()
参见:
- Python: read streaming input from subprocess.communicate()
注意:如果您不需要对输出进行任何操作,则只需删除 stdout=PIPE
,即可在控制台中查看输出:
subprocess.check_call([sys.executable, script_path])
有两个程序 - parent.py 和 myscript.py,如下所示。 parent.py 不断在控制台中打印消息。 myscript.py 需要访问 parent.py 打印的内容。
parent.py:
import time
while 1:
time.sleep(1)
print "test"
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
我希望 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 永远不会完成它的执行。
(我发现了类似的问题,但它们要么不起作用,要么其中一些根本没有答案。)
它是一个 block buffering issue:当 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()
参见:
- Python: read streaming input from subprocess.communicate()
注意:如果您不需要对输出进行任何操作,则只需删除 stdout=PIPE
,即可在控制台中查看输出:
subprocess.check_call([sys.executable, script_path])