2011-07-11 7 views
7

私は、次のような構文があります。ここに連鎖のpopenのサブプロセスが適切に

os.mkfifo('pipe.tmp') 
enc = Popen(['encoder', '-i', 'pipe.tmp']) 
cap = Popen(['capture', '-f', 'pipe.tmp']) 

capと、通常(-fで指定された)ファイルに書き込みプロセスであり、私はそれが画面にデータを吐き出すために得ることができます出力ファイルとして/dev/stdoutを入力します。同様に、encはファイルのようなオブジェクトからの読み込みを想定しており、入力として-を入力してパイプから読み込むことができます。その代わりに、OSに名前付きパイプを使用しての、私はこのように無名のパイプを使用することができ、特別なファイルは必要ではないかもしれないと思った...

cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE) 
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout) 
cap.stdout.close() 

(またノート産卵のための逆転)。一時ファイルが不要なように見えるので、私はこれがより好きですが、私はこのコンストラクトが私の予想どおりにプロセスを連鎖するかどうか少し気になります。

  1. capがOSで実際の標準出力からの個別に話をしていることを/dev/stdoutのですか?つまり、入力パイプ-encにすると、他のプロセスがOS上で/ dev/stdoutとチャットしていても、これらの2つのプロセス間できれいなデータチャネルが得られますか?
  2. ブロッキング/キューイングの動作に大きな違いがありますか?私は私の最初の例では、名前付きパイプはバッファされた4096バイトになり、いずれかの端でブロックされます。cap/encが十分に速く/読み書きしていませんが、私が間違っていれば私を修正します。
  3. は、必要な産卵または終了の特別な順序ですか、それとも私が知っておくべき他の問題?

答えて

1
  1. は/ dev/stdoutがあなたの現在のプロセスの標準出力を提供しますので、あなたはそれを使用するだけで問題ないはずです。
  2. 最初の例のfifoのサイズは、システムの設定によって異なります(変更方法はわかりません)。しかし、subprocess.Popenを使用すると、I/O操作のバッファサイズを定義することができるため、調整することができます。 更新:もう少し調べてみると、bufsize引数の影響を受けないパイプには64kBの制限があることがわかりました。どのように回避するかわかりません(より頻繁に読み込み、バッファリングを手動で処理する場合を除いて)
  3. 2番目の例では、cap.stdoutを使用できるようにするために、指定した順序で開始する必要があるようですencを開始する前にまた、2つのプロセスを切断したまま、手動で通信を処理することもできます。
関連する問題