Ich habe einige Aussagen wie folgt geschrieben:
os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')
beide werden auf einer Konsole angezeigt.
Wie kann ich verhindern, dass die Konsole aufgeht?
Der Prozess STARTUPINFO
kann das Konsolenfenster ausblenden:
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow = subprocess.SW_HIDE # default
subprocess.call('taskkill /F /IM exename.exe', startupinfo=si)
Oder setzen Sie die Erstellungsflags, um das Erstellen des Fensters zu deaktivieren:
CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)
Das obige ist immer noch ein Konsolenprozess mit gültigen Handles für Konsolen-E/A (verifiziert durch Aufruf von GetFileType
für die von GetStdHandle
zurückgegebenen Handles). Es hat nur kein Fenster und erbt nicht die Konsole der Eltern, falls vorhanden.
Sie können einen Schritt weiter gehen, indem Sie das Kind dazu zwingen, überhaupt keine Konsole zu haben:
DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)
In diesem Fall sind die Standard-Handles des Kindes (d. H. GetStdHandle
) 0, Sie können sie jedoch auf eine offene Datenträgerdatei oder -pipe setzen, z. B. subprocess.DEVNULL
(3.3) oder subprocess.PIPE
.
Fügen Sie den Unterprozessaufrufen das Argument Shell=True
hinzu.
subprocess.call('taskkill /F /IM exename.exe', Shell=True)
Wenn Sie nicht darauf warten müssen, verwenden Sie subprocess.Popen
anstelle von subprocess.call
.
subprocess.Popen('taskkill /F /IM exename.exe', Shell=True)