ホームページ > バックエンド開発 > Python チュートリアル > Ruby 出力をストリーミングするときに Python の「subprocess.readlines()」がハングするのはなぜですか?それを修正するにはどうすればよいですか?

Ruby 出力をストリーミングするときに Python の「subprocess.readlines()」がハングするのはなぜですか?それを修正するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-05 16:32:11
オリジナル
830 人が閲覧しました

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

Python サブプロセス Readlines() がハングします

問題ステートメント:

ストリーミングしようとしたときサブプロセス モジュール、readlines() 呼び出しブロックを使用して、Python で Ruby ファイルを 1 行ずつ実行する

原因:

この問題は、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!")
ログイン後にコピー

以上がRuby 出力をストリーミングするときに Python の「subprocess.readlines()」がハングするのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート