Python subprocess.Popen()-子进程使套接字保持打开状态

Python subprocess.Popen()-子进程使套接字保持打开状态,python,python-2.7,sockets,subprocess,Python,Python 2.7,Sockets,Subprocess,我有一个Python2.7脚本,它执行了一些并行魔法,并最终进入flaskgui_循环。在某个时刻,线程使用subprocess.Popen创建后台进程。这很有效 当我的脚本退出且子流程仍在运行时,我无法再次运行脚本,因为flask gui_循环失败,原因是: socket.error: [Errno 98] Address already in use 使用netstat-peanon,当python脚本退出时,我可以看到套接字的所有权转移到子进程。这是python脚本和子流程同时运行时的情

我有一个Python2.7脚本,它执行了一些并行魔法,并最终进入flaskgui_循环。在某个时刻,线程使用subprocess.Popen创建后台进程。这很有效

当我的脚本退出且子流程仍在运行时,我无法再次运行脚本,因为flask gui_循环失败,原因是:

socket.error: [Errno 98] Address already in use
使用netstat-peanon,当python脚本退出时,我可以看到套接字的所有权转移到子进程。这是python脚本和子流程同时运行时的情况:

root@test:/tmp# netstat -peanut | grep 5000
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      1000       840210      21458/python    
终止Python脚本后,套接字不会关闭,但其所有权将传递给子进程:

root@test:~/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

您可以尝试使用with语句。以下是一些文档:

http://preshing.com/20110920/the-python-with-statement-by-example/
https://www.python.org/dev/peps/pep-0343/
这将为您打开/关闭清理。

您应该在创建子进程时使用,这将导致所有文件描述符(以及之前打开的套接字)在子进程中关闭(stdin/stdout/stderr除外)


在较新的版本(Python3.2+)
close\u fds
已经默认为
True
,因为在大多数情况下,您不希望在子进程中继承所有打开的文件描述符,但在python2.7中,您仍然需要显式指定它。

我得到了与python2.7完全相同的东西,可以在Django服务器中启动守护程序,它在Python3.7中运行良好。当Django服务器退出时,守护程序将保持Django服务器端口。公认的答案解决了这类问题。