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

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

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

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 は、対話型アプリケーションを自動化するために設計されたクロスプラットフォーム ライブラリです。擬似端末を介してデータを送受信するための高レベルのインターフェイスを提供します。

1

2

3

import pexpect

 

pexpect.run("ruby ruby_sleep.rb", logfile=sys.stdout)

ログイン後にコピー

2. Stdbuf を使用する:

Stdbuf を使用すると、非対話モードでライン バッファリングを有効にし、出力を行ごとにフラッシュできます。

1

2

3

4

5

6

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 用):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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 サイトの他の関連記事を参照してください。

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