2016-12-27 2 views
0

auf einem Windows Server ich subprocs aus dem Haupt-Skript mit einem neuen Konsolenfenster starten und es in eine Liste von Procs hinzufügen, damit ich sich schließen kann:Python Subprocess CREATE_NEW_CONSOLE Windows-Schließen nicht auf kill()

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

später, wenn ich die procs mit töten:

for p in Proc: 
    p.kill() 

Sie scheinen laufen zu stoppen, aber ich mit Konsolenfenster offen bleibt sich gelassen zu bekommen. An sich keine große Sache, aber das kann sich im Laufe der Zeit summieren und Probleme verursachen.

Das Leben ist viel einfacher mit der neuen Konsole Flagge, aber gibt es einen besseren Weg, um sicherzustellen, dass die Konsole Fenster richtig schließen? Ich könnte mich vielleicht auf einen Taskkill aus der OS-lib verlassen, aber das scheint keine gute Methode zu sein.

Ich sah mich um, es sah aus, als hätten einige Leute Probleme auf Linux-Servern und mussten einen Sigill senden, aber ich dachte, das war es, was die Kill() sowieso machen sollte.

Ich muss vielleicht nur kill() verwenden, um es zu stoppen, dann ein Taskkil, um aufzuräumen, aber ich würde mich über jeden Rat freuen, wenn es einen besseren Weg dazu gibt.

+0

Eine ordentliche Art und Weise ist Übergeben eines Sockets an den untergeordneten Prozess zum Senden einer Beendigungsnachricht. Auf diese Weise kann es elegant verlassen werden. Der Aufruf von 'TerminateProcess' sollte im Allgemeinen der letzte Ausweg sein, da es einem Programm den Boden entzieht. Es ist das Äquivalent von 'SIGKILL' in Unix. – eryksun

Antwort

0

Vielleicht habe ich offensichtlich gelesen .terminate() und .kill() funktionieren anders. Terminate() scheint den Trick richtig zu machen.

+0

Unter Windows ist 'kill' nur ein Alias ​​für' terminate'. Was auch immer sich geändert hat, das ist es nicht. – eryksun

0

ich hatte das gleiche Problem (unter Windows) und ich fand irgendwo SO in (leider war es vor einiger Zeit) der folgende Befehl ein:

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)) 

und es funktioniert ziemlich gut