web-dev-qa-db-de.com

Wie kann ich die Konsole ausblenden, wenn ich os.system () oder subprocess.call () verwende?

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?

45
Synapse

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

82
eryksun

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)
17
Chris Morgan