實時讀取子進程中的標準輸出 [英] Reading stdout from a subprocess in real time

查看:0
本文介紹了實時讀取子進程中的標準輸出的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

給定此代碼片段:

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屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放