Python subprocess.Popen()-子进程使套接字保持打开状态
我有一个Python2.7脚本,它执行了一些并行魔法,并最终进入flaskgui_循环。在某个时刻,线程使用subprocess.Popen创建后台进程。这很有效 当我的脚本退出且子流程仍在运行时,我无法再次运行脚本,因为flask gui_循环失败,原因是: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脚本和子流程同时运行时的情
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服务器端口。公认的答案解决了这类问题。