2016-08-11 4 views
1

私はPython2.7スクリプトをいくつかの並列処理の魔法を行い、最後にFlask gui_loopに入れます。ある時点で、スレッドはsubprocess.Popenを使用してバックグラウンドプロセスを作成します。これは機能します。Python subprocess.Popen() - サブプロセスによりソケットが開いたままになる

私のスクリプトが終了すると、サブプロセスがまだ実行されている場合はフラスコgui_loopがで失敗として、私は、再び私のスクリプトを実行できない場合:netstatの-peanutで

socket.error: [Errno 98] Address already in use 

私はソケットの所有権を確認することができますPythonスクリプトが終了すると、子プロセスに転送されます。これは、Pythonスクリプトとサブプロセスの両方が実行されているとき、それはどのように見えるかです:

[email protected]:~/PycharmProjects/foo/gui# netstat -peanut | grep 5000 
tcp  0  0 127.0.0.1:5000   0.0.0.0:*    LISTEN  1000  763103  19559/my-subprocess 

があります:

[email protected]:/tmp# netstat -peanut | grep 5000 
tcp  0  0 127.0.0.1:5000   0.0.0.0:*    LISTEN  1000  840210  21458/python  

をPythonスクリプトを終了した後、ソケットは近いが、その所有権は子プロセスに渡されませんこれを回避する方法はありますか?サブプロセス(Cで書かれている)は、そのソケット上で何もしていないので、それを必要としません。私はどうにかしてguiループソケットリソースを渡さずにサブプロセスを作成できますか?

私はもちろんプロセスを終了することはできますが、これは、いくつかの計算を中心に単純なGUIを構築し、GUIスクリプトが終了した場合に進捗を失わないようにするためには理想的ではありません。私はちょうどGUIのスクリプトを取得して再び実行することができる場合、サブプロセスへの接続を再接続するためのメカニズムを持っています。

R

答えて

4

サブプロセスを作成するときにはclose_fds=Trueを使用する必要があります。これにより、子プロセス(stdin/stdout/stderrを除く)ですべてのファイル記述子(およびそのオープンソケット)がクローズされます。

close_fdsは、デフォルトでTrueにデフォルト設定されています。ほとんどの場合、子プロセスで開いているファイル記述子を継承したくないのですが、python2.7では明示的に指定する必要があります。

+0

これはトリックを行うようです。ありがとう。 –

1

あなたはステートメントを使用して試みることができます。

http://preshing.com/20110920/the-python-with-statement-by-example/ 
https://www.python.org/dev/peps/pep-0343/ 

これはオープン/クローズクリーンアップです。

関連する問題