0

これは、昨日急いで閉じたこの質問のフォローアップです

標準入力から読み取る2番目のプロセスと一緒にパイプされた2つのPythonプロセスがあります。フィーダー プロセス (出力を stdout に書き込む) が停止する (たとえば、強制終了される) と、他の人が示唆したように、以下のコードが例外を生成すると予想しました。

    while True:
    try:
        l = sys.stdin.readline()
        ## process l

    except Exception, e:
        ## handle exceptions

    except IOError, e:
        ## handle IO exceptions

        if e.errno == errno.EPIPE:
            ## handle EPIPE exceptions

しかし、そうはなりません。代わりに、sys.stdin.readline()単に空の を返しますl

だから2つの質問:

  • フィーダー プロセスが終了したときに例外を取得するようにこのコードを変更することは可能ですか?
  • 2番目のプロセス内のフィーダープロセスのプロセスIDをどうにかして見つけることはできますか? つまり、私のパイプが./step1.py | ./step2.pystep2 内の step1 のプロセス ID を見つけたいとします。試してみos.getppid()ましたが、step1ではなくstep2を実行するbachプロセスのIDを返します。

ありがとう!

4

1 に答える 1

0

まず第一に、なぜあなたはまだそのwhile True:構造に固執するのですか?無限ループが発生する可能性があるため、危険です。あなたのためfor line in sys.stdin:に働きませんか?

そして、この例外が発生しなければ、それは悪いことではありません。これは、「フィーダー」がパイプの端を適切に閉じ、コンシューマーがそれに気づいたことを意味します。そのため、readline()は何も返しません(一度?頻繁に?ブロックしますか?再び無限ループがありますか?)。

明示的に通信する以外に、パイプを介して接続されている別のプロセスのプロセスIDを判別するための適切な方法はないと思います。もちろん、オペレーティングシステムはこの情報を保持します:https ://serverfault.com/questions/48330/how-can-i-get-more-info-on-open-pipes-show-in-proc-in-linux

を介してデータを読み取るPythonスクリプトにデータをパイプすることがよくありますfor line in sys.stdin。このように、供給プロセスが終了し、パイプの彼の側を適切に閉じると、ループはちょうど終了します。

于 2012-09-11T14:04:43.440 に答える