如何在 Python 中启动后台进程?

新手上路,请多包涵

我正在尝试将 shell 脚本移植到更具可读性的 python 版本。原始 shell 脚本在后台使用“&”启动多个进程(实用程序、监视器等)。如何在 python 中实现相同的效果?我希望这些进程不会在 python 脚本完成时死掉。我确信它与守护进程的概念有某种关系,但我找不到如何轻松做到这一点。

原文由 Artem 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

注意:这个答案比 2009 年发布时更新的少。现在 在文档中 推荐使用其他答案中显示的 subprocess 模块

(请注意,subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块比使用这些功能更可取。)


如果您希望您的进程在后台启动,您可以使用 system() 并以与您的 shell 脚本相同的方式调用它,或者您可以 spawn 它:

 import os
os.spawnl(os.P_DETACH, 'some_long_running_command')

(或者,您可以尝试不太便携的 os.P_NOWAIT 标志)。

请参阅 此处的文档

原文由 jkp 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然 jkp 的解决方案有效,但更新的做事方式(以及文档推荐的方式)是使用 subprocess 模块。对于简单的命令,它是等效的,但如果您想做一些复杂的事情,它会提供更多选项。

您的案例示例:

 import subprocess
subprocess.Popen(["rm","-r","some.file"])

这将在后台运行 rm -r some.file 。请注意,在从 Popen 返回的对象上调用 .communicate() --- 将阻塞直到它完成,所以如果你想让它在后台运行,请不要这样做:

 import subprocess
ls_output=subprocess.Popen(["sleep", "30"])
ls_output.communicate()  # Will block for 30 seconds

请参阅 此处 的文档。

另外,澄清一点:您在这里使用的“背景”纯粹是一个外壳概念;从技术上讲,您的意思是您希望在等待进程完成时不阻塞地生成一个进程。但是,我在这里使用“背景”来指代类似 shell 背景的行为。

原文由 Dan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题