2016-12-27 40 views
0

在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

回答

0

也許我誤解了.terminate()和.kill()的工作方式不同。 Terminate()似乎正確地執行了這個技巧。

+0

在Windows上,'kill'只是'terminate'的別名。無論改變什麼,都不是這樣。 – eryksun

0

我有同樣的問題(在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)) 

,它工作得很好