如何在 child 还活着的时候读取它的标准输出
How to read from child's stdout while it still alive
我创建了两个脚本,其中一个脚本执行另一个脚本并尝试实时接收它的输出。
尝试获取输出的脚本:
import subprocess
p = subprocess.Popen("python .\print.py", stdout=subprocess.PIPE)
print p.stdout.readline()
第二个脚本:
import time
print "1se12d12d32d3223"
print "\r"
time.sleep(10000)
问题是我只在 child 进程终止时才得到输出,即使该行已经写入标准输出。
我尝试了以下方法:
- 使用 os.pipe 作为 Popen 的参数,然后从 "read" 管道读取
- 使用 shell=True 作为 Popen 参数
- 使用 bufsize=1 作为 Popen 参数
- 使用 stdout.read()、stdout.readlines()、stdout.read(1) 等...
- 我无法使用 fcntl 模块制作管道 "Not blocking",因为我使用 Windows
我想做的就是在 child 进程还活着的时候读取 stdout 的第一行。我怎样才能在 python 中做到这一点?
默认情况下,Python 缓冲其输出。在某些情况下会自动刷新输出。例如。当您 运行 终端中的第二个脚本时,您将立即看到输出。
您可以通过在 sleep()
调用之前插入 sys.stdout.flush()
来显式刷新输出。
我创建了两个脚本,其中一个脚本执行另一个脚本并尝试实时接收它的输出。
尝试获取输出的脚本:
import subprocess
p = subprocess.Popen("python .\print.py", stdout=subprocess.PIPE)
print p.stdout.readline()
第二个脚本:
import time
print "1se12d12d32d3223"
print "\r"
time.sleep(10000)
问题是我只在 child 进程终止时才得到输出,即使该行已经写入标准输出。
我尝试了以下方法:
- 使用 os.pipe 作为 Popen 的参数,然后从 "read" 管道读取
- 使用 shell=True 作为 Popen 参数
- 使用 bufsize=1 作为 Popen 参数
- 使用 stdout.read()、stdout.readlines()、stdout.read(1) 等...
- 我无法使用 fcntl 模块制作管道 "Not blocking",因为我使用 Windows
我想做的就是在 child 进程还活着的时候读取 stdout 的第一行。我怎样才能在 python 中做到这一点?
默认情况下,Python 缓冲其输出。在某些情况下会自动刷新输出。例如。当您 运行 终端中的第二个脚本时,您将立即看到输出。
您可以通过在 sleep()
调用之前插入 sys.stdout.flush()
来显式刷新输出。