2009-05-19 36 views

答えて

23

あなたがサブプロセスを使用してファイルに直接リダイレクトすることができます。

3)が戻ってデフォルトに標準出力をリダイレクトすることを忘れないでください。

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

最も簡単なのはos.system("the.exe -a >thefile.txt")ですが、標準ライブラリのsubprocessモジュールなど、他の多くの方法があります。

+0

どのようにそのサブプロセスを使用しますか? – Kim

+0

http://docs.python.org/library/subprocess.html#replacing-os-systemをご覧ください。 –

+3

os.systemを使用してリダイレクトしようとすると、オペレーティングシステム間でパイプ記号が異なることを忘れないでください。 – mavnn

3

このようなことができます。 あなたが標準エラー出力に対して同様のことを行うことができます

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

のls -lの出力(または他のコマンド)を読むために/ STDIN

が、アレックスは、ファイルにあなたはそれをしたい場合に述べたように、単にCMDをリダイレクト

ファイルに出力する

+0

長期間実行されるプロセスの場合は、stdout.read()がブロックされていることに注意してください。スクリプトが何か他のことを続行する場合や、出力 'live'に応答する場合は、別のスレッドでサブプロセスを実行する必要があります。 – mavnn

0

実行ファイルを実行して結果を待っているだけなら、おそらくAnuragの解決策が最適です。私はそれが到着したときに各出力行に応答する必要があり、次のことがわかった:

1)書き込み(テキスト)メソッドでオブジェクトを作成する。 stdoutをそれにリダイレクトします(sys.stdout = obj)。 writeメソッドでは、到着時の出力を処理します。

2)は、次のコードのようなものを持つ別々のスレッドでメソッドを実行します。あなたが標準出力をリダイレクトしてきたので

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

、PIPEはラインであなたのwriteメソッドラインに出力を送信します。あなたが改行を取ると確信していないなら、読み(量)もうまくいく、と私は信じている。 = sys.stdoutの__sys.stdout__

0

タイトル(.exe)はWindowsで問題があるようですが、 Python 2.7のMac OS X(10.8)では、受け入れられた答え(stdout/stderr引数を使ったsubprocess.Popen())がうまくいきませんでした。

私はそれを動作させるためにsubprocess.check_output()(Python 2.7以上)を使用しなければなりませんでした。例:

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

このソリューションでは、プログラムの終了時にすべての累積出力が書き込まれます。 実行中にログファイルを監視する場合。あなたは何か他のものを試してみるとよいでしょう。 私自身のケースでは、私は最終結果を気にしていました。

関連する問題