如何从我的python脚本运行一个外部程序,让我们说“Firefox”,并确保在我的python脚本终止后它的进程将保持活动状态?如果它可行,我想让它成为跨平台。
答案 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上搜索shell
,cli
或subprocess
,找到您最喜欢的那个。