subprocess
パイプラインにつなぎ合わせたいインスタンスがいくつかありますが、行き詰まっており、アドバイスを求めたいと考えています。
たとえば、次のように模倣します。
cat data | foo - | bar - > result
または:
foo - < data | bar - > result
...私は最初に次のことを試しましたが、ハングします:
import subprocess, sys
firstProcess = subprocess.Popen(['foo', '-'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
secondProcess = subprocess.Popen(['bar', '-'], stdin=firstProcess.stdout,
stdout=sys.stdout)
for line in sys.stdin:
firstProcess.stdin.write(line)
firstProcess.stdin.flush()
firstProcess.stdin.close()
firstProcess.wait()
2 回目の試行では、パラメーターを使用して 1 つのsubprocess
インスタンスを使用します。これは機能します。shell=True
import subprocess, sys
pipedProcess = subprocess.Popen(" ".join(['foo', '-', '|', 'bar', '-']),
stdin=subprocess.PIPE, shell=True)
for line in sys.stdin:
pipedProcess.stdin.write(line)
pipedProcess.stdin.flush()
pipedProcess.stdin.close()
pipedProcess.wait()
subprocess
最初の連鎖アプローチで何が間違っていますか? 使用しないのが最善であると読みましたshell=True
が、最初のアプローチで何が間違っているのか知りたいです。アドバイスありがとうございます。
編集
質問のタイプミスを修正し、 のstdin
パラメータを修正しましたsecondProcess
。まだハングしています。
firstProcess.wait()
ハングを解決する削除も試みましたが、0バイトのファイルがresult
.
pipedProcess
うまく機能するので、私は に固執します。しかし、最初のセットアップがハングしたり、出力として 0 バイトのファイルを作成したりする理由を誰かが知っている場合は、その理由も知りたいと思います。