打开独立进程的 Python

15 浏览
0 Comments

打开独立进程的 Python

我在使用Python的subprocess模块打开完全独立的进程时遇到了问题。我希望由Python脚本生成的进程即使在Python程序关闭后也能继续运行。我注意到subprocess会创建一个子进程,而nohup无法保持其存活。由于需要在Windows和Linux上都能运行,我不确定os.fork是否适用。\n我希望的结构是一个始终运行的主程序,调用其他程序,如果主程序关闭,我希望生成的程序能够继续运行。\n主程序\n

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)

\n生成的程序\n

import time
l = 1
while l < 100000:
    l += 1
    print(l)
    time.sleep(1)

\n进程树的结构如下:\n主程序\n|_调用的程序\n我希望它的结构是:\n主程序\n调用的程序\n有什么建议吗?我是否应该使用subprocess来实现这个?

0
0 Comments

在Python中,如果要开启一个独立的进程并使其在主进程退出后继续运行,通常可以使用Multiprocessing库,并将该进程设置为守护进程(daemon)。

然而,根据上述内容的描述,使用Multiprocessing库的daemon进程恰好与问题的需求相反。当主进程退出时,所有守护子进程都会被终止。

需要注意的是,在Multiprocessing库中,daemon进程的含义与Unix守护进程(daemon)有所不同。

因此,解决这个问题的方法是使用Open Independent Process Python(开启独立进程的Python)。

具体实现代码如下:

import os
pid = os.fork()
if pid > 0:
    # 主进程退出
    exit()
if pid == 0:
    # 独立进程逻辑
    # ...

通过使用Open Independent Process Python,可以在主进程退出后继续运行独立的子进程,从而实现问题的需求。

0
0 Comments

在开发过程中,我发现没有一种通用的方法来独立地启动程序作为自己的进程。我通过检查操作系统是否为*nix,并在为真时在开头添加'nohup'来实现了我想要的效果。Windows不会终止子进程,所以这样做也是可以的。

然而,发现nohup不足以解决问题,你可能还需要preexec_fn=os.setpgrp(以及Unix守护进程列表中的其他点)。在Windows上没有进程树,而是有"作业对象"。并且默认行为不是终止子进程

下面是一个代码示例,展示了如何在纯Python中模拟nohup

import os
import subprocess
def start_program_independent():
    if os.name == 'posix':
        subprocess.Popen(['nohup', 'python', 'your_program.py'])
    else:
        subprocess.Popen(['python', 'your_program.py'])

通过上述代码示例,我们可以在不同的操作系统上独立地启动程序。如果是*nix系统,我们会使用`nohup`命令来执行程序,而在Windows系统上,我们直接使用`subprocess.Popen`来启动程序。

这样一来,我们就能够解决在不同操作系统上独立启动程序的问题了。

0