2016-08-11 87 views
1

我有一個Python2.7腳本,它執行一些並行性魔術,最後進入Flask gui_loop。在某個點上,一個線程使用subprocess.Popen創建一個後臺進程。這工作。Python subprocess.Popen() - 子進程導致套接字保持打開狀態

當我的腳本將退出,如果子進程仍然在運行,我不能再運行我的腳本,如燒瓶gui_loop失敗:

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

用netstat -peanut我可以看到插座的所有權在python腳本退出時轉移到子進程。這是當兩個python腳本和子進程正在運行它的外觀:

[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腳本,插座不會關閉後,但其所有權被傳遞到子進程:

[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 

有有什麼辦法呢?子進程(用C語言編寫)沒有在該套接字上做任何事情,也不需要它。我可以以某種方式創建一個沒有通過gui循環套接字資源給它的子進程?

我當然可以終止這個過程,但這並不理想,因爲這樣做的目的是圍繞一些計算構建一個簡單的gui,如果gui腳本恰好退出,則不會失去進度。如果我能夠重新啓動並運行gui腳本,我會有一個重新連接子進程的機制。

[R

回答

4

創建子進程時,應該使用close_fds=True,這將導致子進程中的所有文件描述符(以及因此打開的套接字)被關閉(stdin/stdout/stderr除外)。

在新版本(蟒蛇3.2+)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/ 

這會爲您打開/關閉清理。

相關問題