Python 子程序 Readlines() 導致流掛起
程式碼的目標是串流 Ruby 檔案並逐漸輸出其內容。在實作流方面時,遇到 readline() 無限期掛起的問題,從而阻止進一步執行。
潛在解決方案的探索
使用 pty 是依賴平台的假設 Linux 或相容作業系統支援的方法。但是,考慮到跨平台相容性問題:
import errno import os import pty from subprocess import Popen, STDOUT master_fd, slave_fd = pty.openpty() # provide tty to enable line-buffering on ruby's side proc = Popen(['ruby', 'ruby_sleep.rb'], stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, close_fds=True) os.close(slave_fd) try: while 1: try: data = os.read(master_fd, 512) except OSError as e: if e.errno != errno.EIO: raise break # EIO means EOF on some systems else: if not data: # EOF break print('got ' + repr(data)) finally: os.close(master_fd) if proc.poll() is None: proc.kill() proc.wait() print("This is reached!")
對現有pty實現的建議改進:
結論
所有三個提議的解決方案都透過啟用來解決該問題用於立即輸出的行緩衝,而修訂後的pty 方法可確保優雅地處理輸入和輸出,同時最大限度地提高平台相容性。以上是為什麼 Python `subprocess.readline()` 在串流 Ruby 輸出時掛起,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!