web-dev-qa-db-fra.com

Comment masquer la console lorsque j'utilise os.system () ou subprocess.call ()?

J'ai écrit des déclarations comme ci-dessous:

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')

les deux vont faire apparaître une console.

Comment puis-je l'empêcher de faire apparaître la console?

45
Synapse

Le processus STARTUPINFO peut masquer la fenêtre de la console:

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow = subprocess.SW_HIDE # default
subprocess.call('taskkill /F /IM exename.exe', startupinfo=si)

Ou définissez les indicateurs de création pour désactiver la création de la fenêtre:

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)

Ce qui précède est toujours un processus de console avec des descripteurs valides pour les E/S de la console (vérifié en appelant GetFileType sur les descripteurs renvoyés par GetStdHandle). Il n'a tout simplement pas de fenêtre et n'hérite pas de la console du parent, le cas échéant. 

Vous pouvez aller plus loin en obligeant l'enfant à ne pas avoir de console du tout:

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)

Dans ce cas, les descripteurs standard de l'enfant (c.-à-d. GetStdHandle) sont 0, mais vous pouvez les définir sur un fichier de disque ouvert ou un canal tel que subprocess.DEVNULL (3.3) ou subprocess.PIPE

82
eryksun

Ajoutez l'argument Shell=True aux appels de sous-processus.

subprocess.call('taskkill /F /IM exename.exe', Shell=True)

Ou, si vous n'avez pas besoin d'attendre, utilisez subprocess.Popen plutôt que subprocess.call.

subprocess.Popen('taskkill /F /IM exename.exe', Shell=True)
17
Chris Morgan