3

我要制作一个启动器应用程序,但我还没有找到一种方法将子进程完全从产生的 python 进程中分离出来。

当我使用我的桌面(肉桂)启动器启动程序时,进程树会:

/sbin/init-> mdm-> mdm-> cinnamon-session-> cinnamon->the-app-i-launched

在我阅读的线程中,这个是最有见地/最有帮助的:启动一个完全独立的进程。但是当 OP 正在寻求运行 python 代码时得到的答案很混乱,这通常可以通过许多通常首选的方式来实现,而不是通过产生一个独立的进程。

从堆栈溢出的其他帖子中没有回答如何启动分离的python进程:

  • Running daemonalized python code : 适用于将python 代码/模块作为守护进程运行,(不是另一个进程/应用程序)与 python 实例分离。
  • subprocess.call:进程作为 python 进程的子进程生成。
  • os.system:进程作为 python 进程的子进程生成。
  • close_fds:(显然)仅限 Windows(R) 的解决方案,需要可移植的解决方案(主要目标是 Debian linux)。尝试close_fds=True在 linux 上使用时,进程作为 python 进程的子进程生成。
  • creationflags:仅限 Windows(R) 的解决方案。在 linux 上引发:ValueError: creationflags is only supported on Windows platforms.
  • 前缀启动进程nohup:进程作为python进程的子进程产生。据我所知,nohup并非所有平台都提供或等效的,使其成为仅限 linux 的解决方案。
  • os.fork:与“运行守护进程 python 代码”相同。
  • 多处理:与“运行守护进程 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/外壳在非 Linux 平台上可能无法相互渗透的语法。对于Partial Ref的可移植性,我还没有找到任何好的参考资料。
  • subprocess.Popen Alt:我仍然只观察到作为 python 进程的子进程运行的子进程。
4

2 回答 2

1

可以在 JonMc 的回答中找到一个可行的解决方案。我用它来使用“xdg-open”打开文档。

stderr=open('/dev/null', 'w'),如果您不想要日志文件,可以将 stderr 参数更改为。

于 2019-01-11T10:39:47.780 回答
-1

我拥有的唯一可行的解​​决方案,并且可能仅适用于非便携式 Linux,是使用带有 shell-detach-ampersand 语法的 shell 评估。

#!/usr/bin/env python2
import os

os.system('{cmd} &'.format('firefox'))

但是,在窗口管理器会话之外,这可能会在进程树上走得太远,可能不会与您的桌面会话一起退出。

/sbin/init->firefox

于 2015-08-02T22:43:05.740 回答