Python的子进程CREATE_NEW_CONSOLE的Windows不关闭在杀()

问题描述:

在Windows服务器上,我开始从主脚本subprocs一个新的控制台窗口,并将其添加到特效的列表,以便我可以关闭它们:Python的子进程CREATE_NEW_CONSOLE的Windows不关闭在杀()

p = Popen(["python", 'secondscript.py', arg1, arg2, arg3], creationflags=CREATE_NEW_CONSOLE) 
Proc.append(p) 

稍后,如果我杀与特效:

for p in Proc: 
    p.kill() 

他们似乎停止运行,但我不离开得到剩余打开控制台窗口。本身并不是一笔巨大的交易,但随着时间的推移可能会加剧并引发问题。

生活使用新的控制台标志很容易,但有一个确保控制台窗口关闭正常的方法吗?我可以依靠OS lib中的taskkill,但似乎并不是这样做的好方法。

我看了一下,看起来有些人在Linux服务器上遇到了问题,不得不发送sigkill,但我认为这就是kill()应该做的。

我可能不得不使用kill()来停止它的工作,然后使用taskkil来整理,但如果有更好的方法,我会很感激任何建议。

+0

一个更合适的方法是将套接字传递给子进程以发送退出消息。这样它可以优雅地退出。调用TerminateProcess应该是最后的手段,因为它将程序中的地毯拉出来。它相当于Unix中的'SIGKILL'。 – eryksun

也许我误解了.terminate()和.kill()的工作方式不同。 Terminate()似乎正确地执行了这个技巧。

+0

在Windows上,'kill'只是'terminate'的别名。无论改变什么,都不是这样。 – eryksun

我有同样的问题(在Windows上)和我在SO发现某处(可惜是前一段时间)以下命令:

proc_class = subprocess.Popen(r"C:blabla\server.bat", creationflags=CREATE_NEW_CONSOLE) 

... do some stuff ... 

Popen("TASKKILL /F /PID {} /T".format(proc_class.pid)) 

,它工作得很好