python运行外部程序并独立地继续执行
如何从python脚本运行外部程序,比如说“Firefox”,并确保其进程在python脚本终止后保持活动状态?如果可行的话,我想让它跨平台。只有stdlib没有跨平台的方法。但是,如果您为POSIX和Windows编写代码,通常就足够了,对吗 在Windows上,您希望传递一个参数。阅读文档(包括那里和),并决定是否需要控制台分离的进程、新的控制台进程或新的进程组进程,然后使用适当的标志。您可能还需要在python运行外部程序并独立地继续执行,python,cross-platform,subprocess,Python,Cross Platform,Subprocess,如何从python脚本运行外部程序,比如说“Firefox”,并确保其进程在python脚本终止后保持活动状态?如果可行的话,我想让它跨平台。只有stdlib没有跨平台的方法。但是,如果您为POSIX和Windows编写代码,通常就足够了,对吗 在Windows上,您希望传递一个参数。阅读文档(包括那里和),并决定是否需要控制台分离的进程、新的控制台进程或新的进程组进程,然后使用适当的标志。您可能还需要在startupinfo中设置一些标志;再一次,我会告诉你他们的意思 在POSIX上,如果您只
startupinfo
中设置一些标志;再一次,我会告诉你他们的意思
在POSIX上,如果您只需要最简单的行为,并且您使用的是3.2+,那么您需要通过start\u new\u session=True
。在早期的Python版本中,或者在其他情况下,您希望传递一个preexec\u fn
,它允许您执行任何您想要的daemonization。这可能只有os.setsid()
(启动新会话所做的),或者更多。请参阅,了解您可能希望在此处执行的所有不同操作的讨论
因此,最简单的版本是:
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上,找到你最喜欢的一个。@jonjohnson:这是如何回答这个问题的,甚至与之相关?这里的问题是关于
os.system
的报价问题,答案是使用subprocess.call
,它将阻止,直到子进程完成…相关: