2012-01-17 12 views
8

サブプロセスの出力をファイルにリダイレクトしようとしています。subprocess.Popen()IOリダイレクト

server.py:

while 1: 
    print "Count " + str(count) 
    sys.stdout.flush() 
    count = count + 1 
    time.sleep(1) 

Laucher:

cmd = './server.py >temp.txt' 
args = shlex.split(cmd) 
server = subprocess.Popen(args) 

出力はtemp.txtが空のまま、画面に表示されます。 私は何が間違っていますか?

私はすでに書かれたプログラムの出力をキャプチャしようとしています。

私が使用することはできません。

server = subprocess.Popen(
       [exe_name], 
       stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

プログラムはフラッシュないかもしれないと。 代わりに私はfifoを介して出力をリダイレクトしようとしていました。これは、手動でserver.pyを起動してもうまく動作しますが、Popen()がリダイレクトされていない場合は明らかに動作しません。 ps -auxは、server.pyが正しく起動されたことを示しています。

答えて

7

Altenativelyを、あなたはファイルオブジェクトとstdoutパラメータを使用することができます。

with open('temp.txt', 'w') as output: 
    server = subprocess.Popen('./server.py', stdout=output) 
    server.communicate() 

としてはdocumentationで説明:

標準入力、stdoutとstderrを指定します実行されたプログラムの標準入力、標準出力、および標準エラーファイルハンドルをそれぞれ示します。有効な値は、PIPE、既存のファイル記述子(正の整数)、既存のファイルオブジェクト、およびなしです。

+0

これは機能します。通信は、サーバーが終了するまでリーダーをブロックしますが、今はリダイレクトできるので、サーバー出力をFIFOに送ることができます。 –

+1

ここで '.communicate()'を呼び出す必要はありません。 'subprocess.check_call( 'command'、stdout = file)'が動作します。 – jfs

4

">"を使用した出力リダイレクトはシェルの機能です - デフォルトではsubprocess.Popenはインスタンス化しません。これは動作するはずです:

server = subprocess.Popen(args, shell=True) 
+0

これは必要な場合を除いて、好きな方法ではありません(ここではそうではありません)。 – wim