python: fork後の標準出力について
言語はpythonです。(バージョン : 2.6.6)
以下の二つの単純なpythonスクリプト
test.py, exe_fork.py
があります。
[test.py]
#!/usr/bin/env python
import subprocess
proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE)
result = proc.stdout.read()
print result
[exe_fork.py]
#!/usr/bin/env python
import os
import time
pid = os.fork()
if pid != 0:
print "parent\n"
else:
time.sleep(5)
print "child\n"
[動作]
各スクリプトの動作としては、
test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、
read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。
exe_fork.pyはforkして、
親プロセスは"parent"と出力
子プロセスは5秒後に"child"と出力
です。
[実行結果]
test.pyを実行すると
5秒後に
parent
child
と表示されました。
これを実行する前は実行後すぐに
"parent"
と表示されてスクリプト終了するのだと予想しておりました。
しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず
両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。
(どういうしくみでそうなっているのかよくわかりません。。)
[質問・相談]
test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか?
なお、都合上、以下の条件を満たしている必要がございます。
条件1: test.py側のソースは変更しない
条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する
条件3: forkptyは使わない
[参考]
exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。
よろしくお願いします。
お礼
返答ありがとうございます 希望通りになりました。 今後もおねがいします