我想通过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
解决办法A:
把你的test_echo.py改成这样试试:
解决办法B:
执行时使用
PYTHONUNBUFFERED=1 python get_output.py
问题原因就是python里在stdout里输出的所有东西其实都是先放到buffer里的,pycharm会在每个print后自动flush,而正常的python在bash不会。所以要么你自己手动flush一下,要么告诉python我不要buffer直接输出就行了。