实时获取terminal的输出

Posted by kifish on April 23, 2018

实时获取terminal的输出而不是等到程序结束再获得输出。
通过子进程的方法,让父进程获取子进程的输出。

main.py

import time
import sys
import subprocess
import shlex

shell_cmd = 'python sub.py'
cmd = shlex.split(shell_cmd)
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE)
while p.poll() is None:
    line = p.stdout.readline()
    print('get '+line.decode())
def test():
    x = 1
    print(res)
    while x<10:
        x += 1
        print(x)
        time.sleep(1)

sub.py

import time
import sys
x = 1
while x<10:
    x += 1
    print(x)
    sys.stdout.flush() #注意一定要加sys.stdout.flush()
    time.sleep(0.3)

python main.py

如果没有sys.stdout.flush(),仍然无法做到实时。标准输出和标准错误输出有一个缓存的概念,它不会立即将程序的标准输出内容返回,而是会做一定的缓存, 直到缓存满或者程序结束强制清空缓存时才输出。我们只需要在子程序中,每次输出后去手动清空一下缓存即可。