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

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

Patricia Arquette
發布: 2024-12-05 16:32:11
原創
820 人瀏覽過

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

Python Subprocess Readlines() 掛起

問題陳述:

嘗試流式傳輸時使用subprocess 模組在Python 中逐行讀取Ruby文件,readlines() 呼叫區塊無限期地阻止進一步執行。

原因:

在非 Linux 作業系統上使用 pty 模組模擬偽終端時,可能會出現此問題。 pty 是 Linux 特定的函式庫,不保證其在其他系統上的行為。

解決方案:

1.使用Pexpect:

Pexpect 是一個跨互動平台庫,專為自動化互動式平台應用程式而設計。它提供了一個用於透過偽終端發送和接收資料的高級介面。

import pexpect

pexpect.run("ruby ruby_sleep.rb", logfile=sys.stdout)
登入後複製

2.使用 Stdbuf:

Stdbuf 可用於在非互動模式下啟用行緩衝,允許在每一行上刷新輸出。

proc = Popen(['stdbuf', '-oL', 'ruby', 'ruby_sleep.rb'],
             bufsize=1, stdout=PIPE, stderr=STDOUT, close_fds=True)
for line in iter(proc.stdout.readline, b''):
    print(line)
proc.stdout.close()
proc.wait()
登入後複製

3.使用標準庫中的 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!")
登入後複製

以上是為什麼 Python 的 `subprocess.readlines()` 在串流 Ruby 輸出時掛起,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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