调用Python子进程作为守护进程并退出

19

我正在使用一对Python程序,其中一个程序应该调用第二个程序。

但是这应该以第一个程序使第二个程序成为守护进程的方式完成(或在后台运行),然后退出,而不等待第二个程序结束。

在Python中是否可能实现这一点?

我一直在研究os.fork、subprocess模块,但我很困惑如何正确地实现这一点...

2个回答

21

你可以使用subprocess.Popen来实现:

import subprocess

cmd = ['/usr/bin/python', '/path/to/my/second/pythonscript.py']
subprocess.Popen(cmd)

如果你想将 stdoutstderr 重定向到其他地方,你可以通过将 stdout=<file_obj> 传递给 Popen 构造函数来实现。


1
所以,根据这个,'daemon_process' 应该被设置为类似于 '/usr/bin/pyton /path/to/my/second/pythonscript.py' 这样的东西? - Javier Novoa C.
@JavierNovoaC。Popen接受一个参数列表。我会编辑我的回答以澄清。 - Rob Wouters
1
我可以补充一下这个问题(对我很有用),即一个人可以使用subprocess.Popen(cmd, stdout=sys.stdout, stderr=sys.stderr)来获得实时输出吗?谢谢。 - Brandt
这是Python 2吗?我无法在Python 3.7.8中使其工作(并将stdout / stderr发送到devnull)。而且迄今为止似乎很难将进程变成守护进程。 - John C

16
一个“守护进程”比“后台进程”有更具体的定义。 默认情况下,Popen将执行子进程并将控制权返还给您的程序继续运行。 但是,这并不涉及处理信号(特别是,在您的背景进程完成之前用户退出其Shell时收到的SIGHUP信号)或断开与stdin、stderr、stdout和在调用Popen时打开的任何其他文件描述符的连接。
如果你真的需要一个守护进程,你应该使用python-daemon模块,它是PEP 3143的一种实现。 这会处理那些你不想考虑的部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接