76 votes

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

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

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

les deux feront apparaître une console.

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

0 votes

Essayez d'utiliser spawn famille à la place.

1 votes

133voto

eryksun Points 10251

Le processus STARTUPINFO permet de 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 drapeaux 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)

Le processus ci-dessus est toujours un processus de console avec des handles valides pour les E/S de la console (vérifié en appelant GetFileType sur les poignées retournées par GetStdHandle ). Il n'a simplement pas de fenêtre et n'hérite pas de la console du parent, le cas échéant.

Vous pouvez aller encore 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 poignées standard de l'enfant (c.-à-d. GetStdHandle ) sont 0, mais vous pouvez les définir sur un fichier disque ouvert ou un pipe tel que subprocess.DEVNULL (3.3) ou subprocess.PIPE .

30voto

Chris Morgan Points 22285

Ajouter le shell=True aux appels de sous-processus.

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

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

subprocess.Popen('taskkill /F /IM exename.exe', shell=True)

0 votes

Bien sûr, la technique de startupinfo fonctionne, mais celle-ci est plus courte (mais mettez un commentaire pour indiquer pourquoi vous utilisez shell=True sinon cela ne serait probablement pas aussi évident).

1 votes

Hmm, pour une raison quelconque, mon exécutable ne fonctionne pas lorsqu'on utilise shell=True . Mais il fonctionne très bien en utilisant startupinfo.

0 votes

@arifwn : posez une nouvelle question, s'il vous plaît.

0voto

Xenoy Points 47

Ajoute juste : subprocess.call('powershell.exe taskkill /F /IM exename.exe', shell=True)

-2voto

ambagesia Points 381

Essayez subprocess.Popen(["function","option1","option2"],shell=False) .

0 votes

Désolé, le truc que je veux invoquer ne peut pas être exécuté par subprocess.Popen, car une exception est levée "invalid win32 app". Mais os.system peut l'exécuter sans aucun avertissement.

0 votes

Er, ce n'est pas un problème avec subprocess ; je peux le faire tourner sous Windows 7, en natif (Python 2.7.2) ainsi que sous Cygwin (Python 2.6.5), sans aucun avertissement.

1 votes

Ça ne marche pas pour moi, la console s'affiche toujours. De plus, le shell La valeur par défaut de l'argument est False . Le fait de l'adopter explicitement ne devrait pas faire de différence.

-3voto

neferjina Points 37

Essayez de changer l'extension de .py à .pyw.

Il s'agit en fait d'un fichier d'interface utilisateur Python. Il ouvre donc une nouvelle fenêtre sans ligne de commande. Regardez ce lien (filext.com/file-extension/PYW)

3 votes

Bonjour, veuillez fournir des explications supplémentaires pour expliquer comment cela répond à la question. Merci.

1 votes

Il s'agit en fait d'un fichier d'interface utilisateur Python. Il ouvre une nouvelle fenêtre sans ligne de commande. Regardez ce lien ( filext.com/file-extension/PYW )

0 votes

Veuillez modifier la réponse actuelle pour y inclure ces informations utiles, merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X