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

发布于 2021-02-02 23:19:44

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

关注者
0
被浏览
88
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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

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

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

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

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



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    尽管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
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看