我想:
1.从我的进程(myexe.exe arg0)启动新进程(myexe.exe arg1)
1.检索此新进程的PID(OS Windows)
1.当我使用TaskManager Windows命令“结束进程树”终止我的第一个实体(myexe.exe arg0)时,我需要新实体(myexe.exe arg1)不会被终止...
我试过使用子进程。Popen,os.exec,os.spawn,os.system ......都没有成功。
另一种解释这个问题的方法是:如果有人杀死myexe.exe(arg0)的“进程树”,如何保护myexe.exe(arg1)?
编辑:相同问题(无答案)HERE
EDIT:以下命令不保证子进程的独立性
subprocess.Popen(["myexe.exe",arg[1]],creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP,close_fds = True)
4条答案
按热度按时间cbeh67ev1#
要在Windows上启动父进程退出后可以继续运行的子进程,请执行以下操作:
Windows进程创建标志为here
A more portable version is here .
tf7tbtn22#
几年前我在Windows上做过类似的事情,我的问题是想杀死子进程。
我假设您可以使用
pid = Popen(["/bin/mycmd", "myarg"]).pid
运行子进程,所以我不确定真实的的问题是什么,所以我猜是当您终止主进程时。IIRC是和国旗有关的。
我不能证明这一点,因为我没有运行Windows。
cuxqih213#
如果我没理解错的话代码应该是这样的:
至少我试过这个了而且很管用。
hpxqektj4#
我已经尝试了所有建议的Windows 10解决方案,但所有建议的解决方案仍然将新进程作为原始进程的进程树的一部分打开(直接位于主进程之下,或者在主进程之间使用cmd shell)。唯一对我来说,创建完全独立的进程的解决方案是使用cmd.exe启动命令将其分叉:
这实际上更简单,因为它不需要使用stdin/out参数进行mangling。显然,由于它是完全独立的,因此您无法与它通信。但如果需要,您可以使用
psutil
检索它的PID,以便至少监视或关闭它: