2013-08-04 1 views
8

サブプロセスを実行するメインプロセスがあります。これはstdinがパイプしたいものです。私は、ファイルを使用してそれを行うことができます知っている:ファイルを使用せずにサブプロセスパイプstdin

import subprocess 
subprocess.call('shell command', stdin=open('somefile','mode')) 

は、実際のハードドライブのファイルなしカスタムSTDINパイプを使用するための任意のオプションがありますか?たとえば、文字列リストを使用するためのオプションはありますか(各リスト要素は改行になります)?

私は、pythonサブプロセスがパイプオブジェクトに対して.readline()を呼び出していることは知っています。

+1

あなたの質問に必ずしも答え、それは任意のPOSIX準拠のオペレーティングシステムが「ファイル」とは/ dev/STDINの使用をサポートしていることを言及する価値がありますが、これは全体で動作しますストリームを終了するためにEOFを使用するシェルコマンドを使用しています。ちょうどこれをOSX、Linux、OpenBSD上でtcshとbashを使って検証しました。 – synthesizerpatel

+0

@synthesizerpatelは答えではありませんが、貴重なコメントをいただきありがとうございます! – ducin

+1

まあ、公正で、それは** **答えです。ちょうど** **答えではありません。 :D – synthesizerpatel

答えて

4

まず、subprocess.Popen使用 - .callすると、そのための単なるショートカットです、そしてあなたはパイプに書き込むことができるので、あなたはPopenインスタンスにアクセスする必要があります。次に、フラグをstdin kwargとして渡します。何かのように:

import subprocess 
proc = subprocess.Popen('shell command', stdin=subprocess.PIPE) 
proc.stdin.write("my data") 

http://docs.python.org/2/library/subprocess.html#subprocess.PIPE

+0

'stdin = 0'を指定して、stdinファイルハンドルを数値で参照することもできます。 – synthesizerpatel

+0

@synthesizerpatel、それは微妙な違いですが、サブプロセスが親プロセスのstdinを使用するように指示しています。パイプラインされているデータが(文字列のリストから生成された)例では尋ねられたものではありません。それを除けば、私はfd-number-handlesを一般的に( '/ dev/stdin'と同様に)渡すのをやめ、ベンチマークでは処理中のデータがあまりにも遅いことを 'プロキシ'しない限り、その理由は、遅かれ早かれ共有されたstdinが間違ったプロセスが読み込みを行ったときにバグを引き起こし、目的のstdin-handlingプロセスのデータストリームを混乱させるからです。 – AdamKG

+0

十分に公正な、ちょうど番号によるファイルハンドルの使用が言及する価値があると感じた。 – synthesizerpatel

関連する問題