鍍金池/ 問答/Python  Linux/ 通過subprocess實時讀取腳本的輸出內容

通過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環(huán)境下通過python get_output.py它就不能逐行讀取,而是等test_echo.py的結果執(zhí)行完一下 輸出的, 我想知道怎么才能在終端里面也能像pycharm里面一樣逐行讀取,還是需要怎么配置subprocess

回答
編輯回答
兔囡囡

解決辦法A:

把你的test_echo.py改成這樣試試:

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

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

解決辦法B:

執(zhí)行時使用PYTHONUNBUFFERED=1 python get_output.py

問題原因就是python里在stdout里輸出的所有東西其實都是先放到buffer里的,pycharm會在每個print后自動flush,而正常的python在bash不會。所以要么你自己手動flush一下,要么告訴python我不要buffer直接輸出就行了。

2017年3月27日 10:04
編輯回答
礙你眼

如果執(zhí)行的腳本里面也會有輸出內容的時候,這個時候也想把輸出的內容實時顯示出來,去掉stdout緩存的話,可以在執(zhí)行腳本的前面加上 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應用的一個小功能成功了

2018年7月6日 22:56