Windows平台Python 2.7实现切换目录后启动独立进程(脚本退出不终止子进程)的方案咨询
解决方案:在Windows Python2.7中启动独立子进程
我完全懂你的需求——要在Windows上用Python2.7启动一个不随脚本退出而终止的独立进程,之前的代码导致记事本被终止,核心问题出在Windows的进程控制台继承机制上,咱们来调整参数解决这个问题:
问题根源
在Windows系统中,默认情况下子进程会继承父进程的控制台会话。当你的Python脚本退出时,这个控制台会话会被关闭,所有关联的子进程也会被强制终止。你之前使用的CREATE_NEW_PROCESS_GROUP主要是用于控制台进程的信号控制(比如拦截Ctrl+C),但不足以让子进程完全脱离父进程的生命周期绑定。
正确实现代码
要让子进程完全独立,需要结合脱离控制台和重定向标准流两个操作,Python2.7没有subprocess.DEVNULL,所以我们手动调用系统的nul设备来替代:
import os import subprocess # 切换到目标目录 os.chdir('C:/') # 打开系统nul设备,用于重定向子进程的标准流 nul_handle = open(os.devnull, 'w') # 启动独立进程:DETACHED_PROCESS让子进程不继承父控制台,重定向所有IO流避免依赖父进程 process = subprocess.Popen( "notepad.exe", stdin=nul_handle, stdout=nul_handle, stderr=nul_handle, close_fds=True, creationflags=0x00000008 # 对应DETACHED_PROCESS标志 ) # 关闭nul设备句柄 nul_handle.close() # 退出脚本,此时子进程会继续运行 exit()
可选调整
如果你希望子进程拥有自己的独立控制台窗口,可以把creationflags改为0x00000008 | 0x00000010(也就是DETACHED_PROCESS | CREATE_NEW_CONSOLE的组合值),这样记事本会在新窗口中启动,完全独立于脚本的控制台会话。
为什么之前的代码失效
你之前的代码只设置了CREATE_NEW_PROCESS_GROUP和close_fds=True,但子进程依然继承了父脚本的控制台。当脚本退出时,控制台被关闭,导致关联的记事本进程也被终止。加上DETACHED_PROCESS标志和标准流重定向后,子进程就切断了与父进程的所有依赖关联,能够在脚本退出后继续运行。
内容的提问来源于stack exchange,提问作者JimmertyJimmington
相关产品推荐
相关产品推荐

