【问题标题】:python run external program and continue its execution indepententlypython运行外部程序并继续独立执行
【发布时间】:2014-03-15 08:31:04
【问题描述】:

如何从我的 python 脚本运行一个外部程序,比如说“Firefox”,并确保它的进程在我的 python 脚本终止后仍然存在?如果可行,我想让它跨平台。

【问题讨论】:

标签: python cross-platform subprocess


【解决方案1】:

仅使用 stdlib 没有跨平台的方法可以做到这一点。但是,如果您为 POSIX 和 Windows 编写代码,那通常就足够了,对吧?

在 Windows 上,您希望传递 creationflags 参数。阅读文档(那里和at MSDN)并决定是否需要控制台分离进程、新控制台进程或新进程组进程,然后使用适当的标志。您可能还想在startupinfo 中设置一些标志;再次,MSDN 会告诉你他们的意思。

在 POSIX 上,如果您只想要最简单的行为,并且您使用的是 3.2+,那么您需要传递 start_new_session=True。在早期的 Python 版本或其他情况下,您希望传递一个 preexec_fn,它允许您执行任何您想要的守护进程。这可能与os.setsid() 一样少(start_new_session 所做的),或者更多。请参阅PEP 3143 -- Standard daemon process library,了解您可能想在这里做的所有不同事情的讨论。

所以,最简单的版本是:

def launch_in_background(args):
    try:
        subprocess.CREATE_NEW_PROCESS_GROUP
    except AttributeError:
        # not Windows, so assume POSIX; if not, we'll get a usable exception
        p = subprocess.Popen(args, start_new_session=True)
    else:
        # Windows
        p = subprocess.Popen(args, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)

如果您愿意跳出标准库,那里有几十个“shell 类型功能”库,其中许多具有某种“分离”功能。只需在 PyPI 中搜索 shellclisubprocess,即可找到您最喜欢的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2016-10-25
    • 2015-01-21
    相关资源
    最近更新 更多