2

私のpythonスクリプトでは、出力を印刷するWindowsプログラムを実行しようとしています。しかし、その出力をテキスト ファイルにリダイレクトしたいと思います。私は試した

     command = 'program' + arg1 + ' > temp.txt'
     subprocess.call(command)

program はプログラム名で、arg1 は引数です。ただし、出力をテキスト ファイルにリダイレクトするのではなく、画面に出力するだけです。

誰でもこれを行う方法を手伝ってもらえますか? ありがとうございました!

4

2 に答える 2

9

stdoutのパラメータにファイル オブジェクトを渡しますsubprocess.call()

with open('myoutfilename', 'w') as myoutfile:
    subprocess.call(cmd, stdout=myoutfile)
于 2013-01-02T21:18:04.147 に答える
5

shell=Trueで使用できますsubprocess.call

ただし、これを行う(はるかに)より良い方法は次のとおりです。

command = ['program',arg1]
with open('temp.txt','w') as fout:
    subprocess.call(command,stdout=fout)

これにより、全体からシェルが削除され、システムに依存しなくなり、プログラムが「シェルインジェクション」攻撃から保護されます(arg1='argument; rm -rf ~'Windowsの同等物を考慮してください)。

コンテキスト マネージャー (withステートメント) は、「コンテキスト」を離れるときにファイル オブジェクトが適切にフラッシュされて閉じられることを保証するため、良い考えです。

(または同様の) クラスを使用shell=Trueしていない場合は、引数を文字列ではなくリストとして渡す必要があることに注意してください。subprocess.Popenそうすれば、コードはより堅牢になります。文字列を使用したい場合、Python は、shlex.splitシェルと同じように文字列を引数に分割する便利な関数を提供します。例えば:

 import subprocess
 import shlex
 with open('temp.txt','w') as fout:
     cmd = shlex.split('command argument1 argument2 "quoted argument3"'
     #cmd = ['command', 'argument1', 'argument2', 'quoted argument3']
     subprocess.call(cmd,stdout=fout)
于 2013-01-02T21:16:42.707 に答える