オプションでSTDINからの入力を受け付けるプログラムのラッパースクリプトを作成しています。私のスクリプトはファイルの各行を処理する必要がありますが、STDINをラッピングしているプログラムに転送する必要もあります。私は実際にcat
が、それだけでSTDINが正しく転送されているかどうかを実証する例としてのラップしようとしていないよstdinから読み込み、Pythonのサブプロセスに転送します
import subprocess
import sys
for line in sys.stdin:
# Do something with each line
pass
subprocess.call(['cat'])
注:ミニマリスト形式では、これは次のようになります。
上記の例では、forループをコメントアウトすると正しく動作します。しかし、forループで実行すると、STDINの最後まで読み終わったので、何も転送されません。ストリームを探すことができないので、ファイルの先頭にseek(0)
を入れることはできません。
一つの可能な解決策は、ファイル全体をメモリに読み込むことです:動作しますが、非常にメモリが効率的ではありません
import subprocess
import sys
lines = sys.stdin.readlines()
for line in lines:
# Do something with each line
pass
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
p.communicate(''.join(lines))
。誰もがより良い解決策を考えることができますか?おそらくストリームを分割またはコピーする方法は?
追加の制約:
- サブプロセスは一度だけ呼び出すことができます。ですから、一度に1行を読み込んで処理し、それをサブプロセスに転送することはできません。
- ソリューションは、Python 2.6で
、あなたは、サブプロセスの '' stdin'へstdin'から、本質的に順方向データにしたいですか? – bkvaluemeal
はい、私がやりたかったのは、 'stdin'をサブプロセスに転送するだけでしたが、' subprocess.call(['cat']) 'は私が必要とするものでした。私は 'stdin'を転送し、それを読み込んで処理できるようにしたいと思います。 –