- 締切済み
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()メソッドは完了しませんでした。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- SherlockHolmes2
- ベストアンサー率40% (175/429)
sys.stdout.flush() は試してみましたか?
お礼
早速ありがとうございます。 ご提示いただいたように、sys.stdout.flush()を exe_fork.pyの time.sleep(5) の直前でを実行しましてみましたが現象は変わりませんでした。 ↑の認識合ってますか? もし何か試せるようなことがあればまたお願いします。