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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-21 00:21:09233ブラウズ

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

Python サブプロセス Readlines() がストリームでハングアップを引き起こす

コードの目標は、Ruby ファイルをストリーミングし、その内容を段階的に出力することです。ストリーミングの側面は達成されていますが、readline() が無期限にハングし、それ以上の実行が妨げられるという問題が発生しました。

潜在的な解決策の探索

pty の使用はプラットフォームに依存します。 Linux または互換 OS のサポートを前提としたアプローチ。ただし、クロスプラットフォーム互換性の問題を考慮すると、

  • 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!")

結論

提案されている 3 つのソリューションはすべて、ラインバッファリングを有効にすることで問題に対処しています。一方、改訂された pty アプローチは、プラットフォームの互換性を最大限に高めながら、入力と出力の適切な処理を保証します。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。