實時讀取子進程中的標準輸出 [英] Reading stdout from a subprocess in real time
本文介紹了實時讀取子進程中的標準輸出的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
給定此代碼片段:
from subprocess import Popen, PIPE, CalledProcessError
def execute(cmd):
with Popen(cmd, shell=True, stdout=PIPE, bufsize=1, universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
if p.returncode != 0:
raise CalledProcessError(p.returncode, p.args)
base_cmd = [
"cmd", "/c", "d:\virtual_envs\py362_32\Scripts\activate",
"&&"
]
cmd1 = " ".join(base_cmd + ['python -c "import sys; print(sys.version)"'])
cmd2 = " ".join(base_cmd + ["python -m http.server"])
如果我運行execute(cmd1)
,則會毫無問題地打印輸出。
但是,如果我運行execute(cmd2)
,則不會打印任何內容,這是為什么?我如何修復它以便可以實時查看HTTP.SERVER的輸出。
for line in p.stdout
是如何在內部評估的?它是不是某種無休止的循環,直到到達標準的Eof或其他什么?
這個話題在本文中已經討論過幾次了,但我還沒有找到Windows解決方案。上述代碼片段來自answer,我正在從Virtualenv(在Win7上為python3.6.2-32bit)運行HTTP.SERVER
推薦答案
如果要從正在運行的子進程中連續讀取,則必須使該進程的輸出無緩沖。您的子進程是一個Python程序,這可以通過將-u
傳遞給解釋器來完成:
python -u -m http.server
這是它在Windows框上的外觀。
這篇關于實時讀取子進程中的標準輸出的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文