あなたがここに欲しいことは(明らかに)パイプのシリーズです:
com[0] | com[1] | ... | com[n-1]
最も簡単な方法は、あなたが「悪い」の文字とシェルを心配する必要はありません場合は、単にそれらすべてに参加することです一つの大きなシェルコマンドへのアップ:また
p = subprocess.Popen(' | '.join(' '.join(words) for words in com), shell=True, ...)
、あなたが最初にSTDOUT = Noneを望んないので、あなたは、単にpは当初なしの.stdoutを持つ任意のオブジェクトであるのPSTのトリック@使用することができます。しかし、以前の各サブプロセスを閉じるシステムに依存していることにも注意してください.Popen()は出力パイプがclose()になるようにd)CPythonでは起こりますがJythonでは起こらないループ内で私が理解するように、私は実際にJythonを使用していません)。あなたは次のいずれかに各popenの()、この意志パイプの各サブコマンドからのエラー出力に標準エラー出力= subprocess.STDOUTをリダイレクトする場合
# assumes len(com) >= 1
p0 = subprocess.Popen(com[0], stdout=subprocess.PIPE)
# don't use stderr=subprocess.PIPE -- if you want stderr to be piped too
# use stderr=subprocess.STDOUT, or create a stderr pipe early manually and
# supply the fd directly; see hints in text below.
for words in com[1:]:
p1 = subprocess.Popen(words, stdin=p0.stdout, stdout=subprocess.PIPE)
# again you don't want to set stderr to subprocess.PIPE here
p0.stdout.close() # now that it's going to p1, we must ditch ours
p0 = p1 # p1 becomes the input to any new p1 we create next time
# at this point, use p0.communicate() to read output
:だから、より明示的なループをお勧めします。これらのすべてをプログラムにパイプするには、最初にOSレベルのパイプオブジェクトを作成してから、それぞれをその(シングル)パイプの書き込み側に接続し、次にサブプロセスモジュールを覗き込んで、それを指す「最終」サブプロセスオブジェクトを取得する必要がありますその選択/ポーリングコードがそのパイプから任意のデータを吸い取るようにします。 (subprocess.communicate()は2本のだけなのパイプから、複数を読み込みますので、あなたは独立して、個々のサブコマンドの標準エラー出力をキャプチャすることはできません。)
注:上記のいずれもテストされていない...
*クワックquack!*この例では、 'Popen'オブジェクトである必要はありません。単にオブジェクトが適切な 'stdout'を持っています(そして、空でない" Popen "はシステム/ OSの観点からはほとんどの場合意味がありません:-) –
これは、ダミーのPopenオブジェクトを作成するのに比べてstdoutのdefです。しかし、最も正しい方法は何でしょうか。 –