2017-03-20 12 views
0

subprocess.Popenでいくつかのプログラムを実行し、ファイルにstdout/stderrを記録するpythonサービスがあります。それは答えhereに基づいてうまく動作します。サブプロセスからstdoutをファイルに安全にリダイレクトします.Popen

サービスとして動作しているので、クリーンアップが正しく行われていることを確認してください。コードは、これと同様の構造を有する:

while RunningService: 
    try: 
     command = "some command to run the program with arguments" 

     with open('out-file.txt', 'a') as f_out: 
      myProc = subprocess.Popen(command, stdout=f_out, stderr=f_out) 

     # some looping/waiting 
     # ... 
     # ... 

     if breakCondition: 
      break 

    except Exception as e: 
     # do some error logging for the caught exception 
    finally: 
     myProc.kill() 

私が理解したいことは、我々はプロセスを強制終了する場合、ファイルハンドルf_outに何が起こるかです。ファイルはいつ閉じますか?他の関数でPopenオブジェクトを作成して返すと、それは違うでしょうか?

+0

'with open ... as f_out:'スコープを終了すると 'f_out'が破壊されます。 –

答えて

0

まず、それは間違っている:

myProc = subprocess.Popen(command, stdout=f_out, stderr=f_out) 

あなたがstdoutstderrの両方にf_outを使用するのではなくてはならない。注意してください、そして、

myProc = subprocess.Popen(command, stdout=f_out, stderr=subprocess.STDOUT) 

を:あなたのプロセスはwithを超えて実行された場合ブロックして閉じたファイルに書き込もうとすると、例外が発生します。

ブロックはwithブロック内から終了する必要があります。終了するには、myProc.wait()(ブロッキング)またはmyProc.poll() is not None(ノンブロッキング)を使用してください。

+0

この場合、プロセスからの 'stdout'と' stderr'は同じファイルに書き込まれますが、 'stderr'は' stdout'を経由しますか? – dixie

+0

同じファイルです。自分で試してみてください。 –

関連する問題