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中文網其他相關文章!