Python在linux上生成detatched non-python进程?

时间:2015-08-02 22:43:06

标签: python subprocess launcher detach platform-independent

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

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

  

/ sbin / init - > mdm - > mdm - > 肉桂会话 - > 肉桂 - > 的应用内-i的发射

在我读过的帖子中,这个是最有洞察力/最有帮助的:Launch a completely independent process。但是,由于OP正在寻求运行python代码,因此通常可以通过许多通常优先的方式实现,而不是通过产生独立的进程来实现。

来自堆栈溢出的其他帖子,它们没有回答如何启动detatched python进程:

  • Running daemonalized python code:适用于将 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
  • prefix launched process with nohup:进程生成为python进程的子进程。据我所知,nohup或同等版本并非在所有平台上都可用,使其成为仅支持Linux的解决方案。
  • os.fork:与"运行daemonalized python代码相同"。
  • multiprocessing:相同的问题和#34;运行daemonalized 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平台上可能无法互操作。我还没有在 Partial Ref 上挖掘任何关于可移植性的好参考。
  • subprocess.Popen Alt :我仍然只是观察了作为python进程的子进程运行的子进程。

2 个答案:

答案 0 :(得分:1)

可以在JonMc的答案here中找到有效的解决方案。我用它来通过'xdg-open'打开文档。

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

答案 1 :(得分:0)

我唯一可行的解​​决方案就是使用shell-detach-ampersand语法进行shell评估。

#!/usr/bin/env python2
import os

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

但是,在窗口管理器会话之外,这可能会在流程树中走得太远,可能不会退出桌面会话。

  

/ sbin / init - > 火狐