从Python启动一个完全独立的过程

gre*_*hat 29 python windows-installer popen

我正在尝试从python启动一个完全独立的进程.我不能使用像os.startfile这样简单的东西,因为我需要传递参数.目前我正在使用subprocess.popen,它让我90%的方式.

args = ["some_exe.exe", "some_arg", "another_arg"]
subprocess.Popen(args, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

使用带有分离创建标志和std*管道的popen会启动一个新进程,该进程在父进程终止后继续存在.这一切都很好.问题是新的'子'进程仍然保留了父进程的幻象句柄.因此,如果我尝试卸载父exe(我的python脚本通过pyinstaller捆绑到exe),msiexec抱怨父exe仍在使用中.

因此,目标是生成一个完全独立的进程来运行"some_exe.exe",它没有任何句柄回原始进程.

注意:这适用于Windows XP及更高版本.我正在开发Win7.

gre*_*hat 24

我想我找到了答案.通过使用Popenclose_fds = True我能够启动一个过程,这是独立的,不带把手的父.

对于文档,请查看此处并搜索close_fds.

或者,在Windows上,如果close_fds为true,则子进程不会继承任何句柄.需要注意的是在Windows上,你可以不设置close_fds为真,并通过设置标准输入,标准输出或标准错误重定向标准的句柄.

请注意,此解决方案仅适用于Windows.我不知道任何*nix系统.

  • 我一直在尝试使用从 makefile 中调用的 python 脚本来启动守护进程,但是在该守护进程自行退出之前 make.exe 不会退出,这不是我想要的。最终起作用的是“close_fds=True”**和**“creationflags=DETACHED_PROCESS”的组合。结论:同时使用它们,例如:`subprocess.Popen(<whatever>, close_fds=True,creationflags=DETACHED_PROCESS)` (2认同)