首頁 >後端開發 >Python教學 >如何在 Python 中從子程序的輸出流執行非阻塞讀取?

如何在 Python 中從子程序的輸出流執行非阻塞讀取?

DDD
DDD原創
2024-12-17 22:06:12177瀏覽

How Can I Perform Non-Blocking Reads from a Subprocess's Output Stream in Python?

Python 中子程序輸出流的非阻塞讀取

在Python 中,subprocess 模組提供了一種便捷的方式來啟動並與外部互動流程。然而,高效處理父進程和子進程之間的 I/O 互動至關重要。

考慮以下場景:您希望對子程序的標準輸出流執行非阻塞讀取。預設情況下,p.stdout.readline() 會阻塞,直到緩衝區中的資料可用。為了解決這個問題,我們可以採用一種涉及單獨執行緒和佇列的技術。

首先,建立一個佇列來儲存輸出行:

from Queue import Queue

接下來,啟動一個執行緒來讀取來自子程序標準輸出的行並將它們排入佇列:

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

初始化子進程並啟動thread:

p = Popen(['myprogram.exe'], stdout=PIPE)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True
t.start()

要非阻塞讀取一行,請使用以下方法:

try:
    line = q.get_nowait()  # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else:  # got line
    # do something with the line

此方法跨平台相容,並確保非阻塞讀取,讓您高效處理來自子進程的資料。

以上是如何在 Python 中從子程序的輸出流執行非阻塞讀取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn