2016-11-18 16 views
0

私はこのように開くp.terminateと私のサブプロセス終了:あなたは私はテキストファイルにすべてのエラーをリダイレクト見ることができるように)(p.terminateで終了したプロセスにSIGTERM上のファイルをログ書く

p = Popen([sys.executable, args], stdin=PIPE, stdout=PIPE, stderr=open("error.txt", 'a')) 

を私はいつも読むことができます。 私はサブプロセスが終了しますと、このファイルに何かを印刷するには、この機能をmissused:

signal.signal(signal.SIGTERM, sigterm_handler) # sets shutdown_flag 
while True: 
    if shutdown_flag: 
     print("Some Useful information", file=sys.stderr) 

しかし:ファイルは常に空です。これは、terminateが呼び出されたときにパイプが閉じられ、この時点でサブプロセスから書き込まれたものが失われるためですか?それとも私はここで見ていない他の問題はありますか?

答えて

0

一般に、スレッドを終了することはお勧めできません。むしろ、threading.Eventを使用して終了するように要求する必要があります。

event = threading.Event() 
while not event.isSet(): # use this instead of while True: 
    # do your stuff 

# now write your file 
print("Some Useful information", file=sys.stderr) 

その後、代わりにp.terminateの()、使用:

threading.Event().set() 
+0

すると、私は、スレッドが、サブプロセスを使用していません。同じように動作しますか? – Fuzzyma

+0

私の悪い。私は脳に糸を持っていた。 あなたができることは似ています。つまり、プロセスを終了させるのではなく、終了するように指示します。 p.terminate()の代わりにp.communicate(「シャットダウンしてください」)をお勧めします その後、元のスニペットでイベントを待つのではなく、stdinのデータを "please shut down"(またはあなたが望むどんな文字列でも)。 また、重要なことに、p.communicate()の後にp.wait()を実行します。 – Martin

+0

私はプロセスにデータをパイプするので、私の場合は簡単に行えません。ソリューションを設定すると、データフローと制御フローが混在し、分離しておく必要があります – Fuzzyma

関連する問題