簡體   English   中英

為什么子進程的管道輸出與Python不可靠?

[英]Why is piping output of subprocess so unreliable with Python?

(視窗)

我編寫了一些調用程序SoX(子進程模塊)的Python代碼,它在STDERR上輸出進度,如果你指定它的話。 我想從輸出中獲取百分比狀態。 如果我不是從Python腳本中調用它,它會立即啟動並且順利進行到100%。

如果我從Python腳本中調用它,它會持續幾秒鍾直到它開始,然后它在慢速輸出和快速輸出之間交替。 雖然我有時會讀取char中的char,但是還有一個大塊的RUSHES。 所以我不明白為什么在其他時候我可以逐一看到角色越來越多。 (順便說一句,它在我的測試中產生了15KiB的數據。)

我用mkvmerge和mkvextract進行了相同的測試。 他們也輸出百分比。 讀STDOUT是順利的。

這太不可靠了! 如何使sox的stderr流的讀取更順暢,並且可能防止開始時的延遲?


我如何打電話和閱讀:

process = subprocess.Popen('sox_call_dummy.bat', stderr = subprocess.PIPE, stdout = subprocess.PIPE)
while True:
    char = process.stderr.read(1).encode('string-escape')
    sys.stdout.write(char)

根據這個密切相關的線程: 使用Python中的子進程從進程中進行無緩沖讀取

process = subprocess.Popen('sox_call_dummy.bat', 
                stderr = subprocess.PIPE, bufsize=0)
while True:
    line = process.stderr.readline()
    if not line: 
        break
    print line

既然你沒有讀stdout,我認為你不需要管道。

如果您想嘗試按原始示例中的char讀取char,請嘗試每次添加flush:

sys.stdout.write(char)
sys.stdout.flush()

每次寫入時刷新stdout都是手動相當於禁用python進程的緩沖: python.exe -u <script>或設置env變量PYTHONUNBUFFERED=1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM