通过subprocess实时读取脚本的输出内容

我想通过subprocess实时获取脚本的输出内容
下面是我的脚本

test_echo.py

import time
for i in range(10):

print(i)
time.sleep(0.5)

下面是读取的脚本:

脚本名字get_output.py

import subprocess

cmd = '/root/test_echo.py'
p = subprocess.Popen(['python',cmd],stdout=subprocess.PIPE, stderr=subprocess.STDOUT,bufsize=1)
while 1:

line = p.stdout.readline()
if line != '' and p.poll() is None:
    print line
else:
    break

我用pycharm调试上面的内容可以正常的逐行(实时)读取test_echo的内容,但是我把脚本放到centos或者mac上的shell环境下通过python get_output.py它就不能逐行读取,而是等test_echo.py的结果执行完一下 输出的, 我想知道怎么才能在终端里面也能像pycharm里面一样逐行读取,还是需要怎么配置subprocess

阅读 7k
2 个回答

解决办法A:

把你的test_echo.py改成这样试试:

import sys
import time
for i in range(10):

    print(i)
    sys.stdout.flush()
    time.sleep(0.5)

解决办法B:

执行时使用PYTHONUNBUFFERED=1 python get_output.py

问题原因就是python里在stdout里输出的所有东西其实都是先放到buffer里的,pycharm会在每个print后自动flush,而正常的python在bash不会。所以要么你自己手动flush一下,要么告诉python我不要buffer直接输出就行了。

如果执行的脚本里面也会有输出内容的时候,这个时候也想把输出的内容实时显示出来,去掉stdout缓存的话,可以在执行脚本的前面加上 PYTHONUNBUFFERED=1 python get_output.py, 也可以用p = subprocess.Popen(['python', "-u", 'get_output.py'],stdout=subprocess.PIPE, stderr=subprocess.STDOUT,bufsize=1), python -u 和 PYTHONUNBUFFERED=1是一样的效果,很6 实时web应用的一个小功能成功了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题