打开独立进程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 in multiprocessing 与Unix daemon具有不同含义

以上是关于打开独立进程python的主要内容,如果未能解决你的问题,请参考以下文章

python下的多线程与多进程

subprocess模块详解

python——线程

Python 线程和进程

Python24 进程

VisualStudio 独立运行HelpViewer帮助文档