首頁 > 後端開發 > Python教學 > 為什麼 Python `subprocess.readline()` 在串流 Ruby 輸出時掛起,如何修復它?

為什麼 Python `subprocess.readline()` 在串流 Ruby 輸出時掛起,如何修復它?

Linda Hamilton
發布: 2024-12-21 00:21:09
原創
272 人瀏覽過

Why Does Python `subprocess.readline()` Hang When Streaming Ruby Output, and How Can I Fix It?

Python 子程序 Readlines() 導致流掛起

程式碼的目標是串流 Ruby 檔案並逐漸輸出其內容。在實作流方面時,遇到 readline() 無限期掛起的問題,從而阻止進一步執行。

潛在解決方案的探索

使用 pty 是依賴平台的假設 Linux 或相容作業系統支援的方法。但是,考慮到跨平台相容性問題:

  • Pexpect: 該程式庫可以提供另一種方法來管理進程互動。
  • stdbuf: 此工具允許在非互動模式下進行行緩衝,從而實現即時
  • 修改後的pty 方法:
修改後的pty 方法:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板