2016-06-28 4 views
1

次のpythonコード(Python 2.7)を実行すると、空の出力ファイルが得られますが、私はその行を期待しています。なにが問題ですか?pythonサブプロセスが標準出力に書き込まない

import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.stdin.write('Line I want into out file\n') 
    pp.terminate() 

答えて

2
あなたは terminate Dプロセス

、決してフラッシュは/それへの入力を閉じて、そのすべてのデータがバッファ内に立ち往生し、プロセスが強制的に殺された時に捨てました。その後、完了するために、プロセスを待って、stdinを閉じ、入力を渡して結合するcommunicateを使用することができます。

この場合
import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.communicate('Line I want into out file\n') 

(唯一の3つの標準ハンドルのパイプである)、あなたも安全にこれを行うことができます:

import subprocess 

with open('outfile.out', 'w') as out: 
    pp=subprocess.Popen(['/bin/cat'],stdin=subprocess.PIPE,stdout=out) 
    pp.stdin.write('Line I want into out file\n') 
    pp.stdin.close() 
    pp.wait() # Optionally with a timeout, calling terminate if it doesn't join quickly 

これは、単一の標準ハンドルをPIPEとして使用する場合にのみ実行してください。 2つ以上がPIPEである場合、デッドロックの危険性があります(子供はstdoutに書き込み、バッファをクリアするために読むことを待っています、あなたはstdinに書き込んでいます、子供がバッファをクリアするのを待っています)。communicateスレッドや選択モジュールを使用すると、デッドロックを避けるためにそのデザインを模倣する必要があります。

+1

'pp.join()'の代わりに 'pp.wait()'を使用します( 'multipprocessing'ではなく' subprocess'です)。 Python 2.7に 'timeout'パラメータはありません(' subprocess32'モジュールを使わない限り)。 – jfs

+0

@ J.F.Sebastian: 'wait'と' join'ビットを修正しました。あなたのコメントは、 'timeout'が利用可能になったときに明らかになります。 – ShadowRanger

関連する問題