我需要制作一个启动器应用程序,但我还没有找到完全从生成的Python进程中分离子进程的方法。
当我使用桌面(cinnamon)的启动器启动程序时,进程树如下所示:
/sbin/init->mdm->mdm->cinnamon-session->cinnamon->我启动的应用程序
在我阅读的讨论中,这篇文章是最有见地和有帮助的: Launch a completely independent process。但由于OP正在寻求运行Python代码,因此答案变得混乱不清,因为通常可以通过许多首选的方式来实现它,而不是生成独立的进程。
从其他Stack Overflow帖子中获得的信息并未回答如何启动分离的Python进程:
当我使用桌面(cinnamon)的启动器启动程序时,进程树如下所示:
/sbin/init->mdm->mdm->cinnamon-session->cinnamon->我启动的应用程序
在我阅读的讨论中,这篇文章是最有见地和有帮助的: Launch a completely independent process。但由于OP正在寻求运行Python代码,因此答案变得混乱不清,因为通常可以通过许多首选的方式来实现它,而不是生成独立的进程。
从其他Stack Overflow帖子中获得的信息并未回答如何启动分离的Python进程:
- 运行守护进程化的Python代码:适用于将Python代码/模块作为守护进程运行,(而不是其他进程/应用程序),并与Python实例分离。
- subprocess.call:进程作为Python进程的子进程生成。
- os.system:进程作为Python进程的子进程生成。
- close_fds:(显然)仅适用于Windows(R),需要便携解决方案(主要目标是Debian Linux)。在Linux上尝试使用
close_fds=True
时,进程会作为Python进程的子进程生成。 - creationflags:仅适用于Windows(R)。在Linux上引发:
ValueError: creationflags is only supported on Windows platforms
。 - 以
nohup
前缀启动进程:进程作为Python进程的子进程生成。据我所知,nohup
或等效操作不可用于所有平台,这使得它成为仅适用于Linux的解决方案。 - os.fork:与“运行守护进程化的Python代码”相同。
- multiprocessing:与“运行守护进程化的Python代码”问题相同:仅适用于运行Python代码/模块。
- os.spawnl* + os.P_NOWAIT:不建议使用已弃用的函数编写新代码。在我的测试中,我根本没有看到我的进程被生成。
- os.spawnl* + os.P_DETACH:仅适用于Windows(R),似乎已在当前的Python 2.X版本中删除:
AttributeError: 'module' object has no attribute 'P_DETACH'。
- os.system + shell fork:我能够看到我的进程实际上是从Python进程中分离出来运行的,但是我担心它存在以下缺陷:
- 依赖于在shell中运行命令,这更容易受到恶意攻击,无论是有意还是无意的?。
- 依赖于不可移植?的POSIX / shell?语法,可能在非Linux平台上无法解释。我没有找到任何关于在部分Ref上的可移植性的好参考资料。
- subprocess.PopenAlt:我仍然只观察到子进程作为Python进程的子进程运行。