python运行外部程序并继续独立执行

时间:2014-02-16 00:05:05

标签: python cross-platform subprocess

如何从我的python脚本运行一个外部程序,让我们说“Firefox”,并确保在我的python脚本终止后它的进程将保持活动状态?如果它可行,我想让它成为跨平台。

1 个答案:

答案 0 :(得分: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)

如果你愿意走出stdlib之外,那里有许多“shell类型功能”库,其中许多都有某种“分离”功能。只需在PyPI上搜索shellclisubprocess,找到您最喜欢的那个。