Python サブプロセス Readlines() がストリームでハングアップを引き起こす
コードの目標は、Ruby ファイルをストリーミングし、その内容を段階的に出力することです。ストリーミングの側面は達成されていますが、readline() が無期限にハングし、それ以上の実行が妨げられるという問題が発生しました。
潜在的な解決策の探索
pty の使用はプラットフォームに依存します。 Linux または互換 OS のサポートを前提としたアプローチ。ただし、クロスプラットフォーム互換性の問題を考慮すると、
既存の 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 サイトの他の関連記事を参照してください。