打开独立进程python
Posted
技术标签:
【中文标题】打开独立进程python【英文标题】:open independent process python 【发布时间】:2015-12-20 22:44:09 【问题描述】:我在使用 subprocess 模块通过 Python 打开完全独立的进程时遇到了问题。即使 python 程序死了,我也需要 python 脚本生成的进程继续存在。我注意到 subprocess 创建了一个子进程,而 nohup 并没有使其保持活动状态。它需要在 Windows 和 Linux 上都可以工作,所以我不确定 os.fork 是否可以工作。
我的目标是一个始终运行的主程序,它调用其他程序,如果主程序死了,我希望衍生的程序继续存在。
主程序
import subprocess
import time
subprocess.Popen(["/usr/bin/python", "/home/jchoinski/Desktop/Sentinel1.1/programTest.py"], stdin=subprocess.PIPE, stdout=PIPE, stderr=PIPE)
while True:
time.sleep(1)
衍生程序
import time
l = 1
while l < 100000:
l += 1
print(l)
time.sleep(1)
进程树如下所示:
主程序 |_调用程序
我希望它看起来像:
主程序 调用程序
有什么想法吗?我什至应该为此使用子流程吗?
【问题讨论】:
***.com/questions/8947711/… ***.com/questions/13592219/… 第一个链接不会产生独立进程,第二个链接不适用于 *nix 系统。 不知道如何做到独立于平台,但en.wikipedia.org/wiki/Nohup 和这个***.com/questions/285015/… 有一些一般的线索。 除非你从管道中读取数据,否则不要使用PIPE
。 Use subprocess.DEVNULL
instead。此外,明确使用close_fds=True
(Python 2 需要它)。它还应该解决“nohup 无法保持活力”的问题。
【参考方案1】:
我找不到真正通用的方式来独立启动程序,因为它是自己的进程。我设法通过检查它是否是*nix 操作系统并在开头附加“nohup”(如果为真)来获得我想要的东西。 Windows 不会杀死子进程,所以它成功了。
【讨论】:
nohup
is not enough,你可能也需要preexec_fn=os.setpgrp
(也许还有other points from Unix daemon list)。 Windows 上没有进程树。 Windows 上有“作业对象”和the default behavior is not to kill child processes
这里是code example that shows how to emulate nohup
in pure Python【参考方案2】:
改用Multiprocessing 库并将进程作为daemon
运行。
【讨论】:
这与 OP 想要的相反。如果主进程退出,那么它的所有守护子进程都会被杀死。注意:daemon process inmultiprocessing
与Unix daemon具有不同含义以上是关于打开独立进程python的主要内容,如果未能解决你的问题,请参考以下文章