一尘不染

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

python

我正在尝试将Shell脚本移植到可读性更高的python版本。原始的shell脚本在后台使用“&”启动多个进程(实用程序,监视器等)。如何在python中达到相同的效果?我希望这些过程在Python脚本完成后不会消失。我敢肯定它与守护程序的概念有关,但是我找不到如何轻松实现此目的。


阅读 999

收藏
2020-02-14

共2个答案

一尘不染

注意:此答案的最新版本比2009年发布时要少。subprocess现在建议在文档中使用其他答案中显示的模块

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

如果你希望你的进程在后台启动,则可以使用system()与你的Shell脚本相同的方式来使用和调用它,也可以spawn

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

(或者,你也可以尝试使用便携性较差的os.P_NOWAIT标志)。

2020-02-14
一尘不染

尽管jkp的解决方案有效,但是更新的方法(以及文档建议的方法)是使用subprocess模块。对于简单的命令,它等效,但是如果你要执行复杂的操作,它提供了更多选项。

你的案例示例:

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

这将rm -r somefile在后台运行。请注意,调用.communicate()从返回的对象Popen将一直阻塞,直到完成为止,因此,如果要使其在后台运行,请不要这样做:

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

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

2020-02-14