Si je sauvegarde mes fichiers de code en tant que .pyw
, aucune fenêtre de console n'apparaît - ce que je veux - mais si le code inclut un appel à os.system
, je reçois toujours une fenêtre de console embêtante. Je suppose qu'il est causé par l'appel à os.system
. Existe-t-il un moyen d'exécuter d'autres fichiers à partir de mon script .pyw
sans augmenter la fenêtre de la console?Comment éviter la fenêtre de console avec le fichier .pyw contenant l'appel os.system?
Répondre
Vous pouvez essayer d'utiliser le module subprocess (subprocess.Popen
, subprocess.call
ou autre) avec l'argument shell=True
si vous voulez éviter le démarrage d'une fenêtre de la console.
subprocess.check_call remplace dans ce cas os.system. – esm
Cela a fonctionné ... Merci! – twneale
Veillez à définir 'subprocess.check_call (args, shell = True)' où 'args' est la chaîne de commande que vous tapez habituellement dans une console. Je ne sais pas pourquoi 'shell = True' est nécessaire quand je ne veux pas qu'une console apparaisse, mais c'est ce qui s'est passé dans mon expérience. – Kit
Vous devez utiliser subprocess.Popen
passer de classe comme instance de valeur du paramètre startupinfo
de subprocess.STARTUPINFO
classe avec dwFlags
attribut tenant subprocess.STARTF_USESHOWWINDOW
drapeau et wShowWindow
attribut tenant subprocess.SW_HIDE
drapeau. Ceci peut être déduit de la lecture des lignes 866-868 du code source subprocess.py
. Il peut être nécessaire de passer également le drapeau subprocess.CREATE_NEW_CONSOLE
comme valeur du paramètre creationflags
lorsque vous exécutez sous pythonw.exe
qui n'ouvre pas de console. Lorsque vous utilisez shell=True
, il se trouve que tout ce qui précède est réglé correctement, mais cela ne signifie pas que c'est une bonne solution. Je dirais que ce n'est pas parce que cela ajoute un surcoût de l'exécution de l'interpréteur de commandes et des arguments d'analyse. En outre, vous devez garder à l'esprit que (...) l'utilisation de shell = True est fortement déconseillé dans les cas où la chaîne de commande est construite à partir de l'entrée externe conformément à la documentation du module de sous-processus.
L'entrée ne provenait pas d'une source externe et je ne me soucie pas de l'overhead de l'analyse de la commande shell, surtout si l'éviter implique la solution trop compliquée que vous décrivez ci-dessus. – twneale
Utiliser 'shell = True' n'est pas la bonne chose à faire ici et la complexité (supposée) de la bonne solution ne change pas cela. –
Je ne peux pas croire que ce n'est pas la plus haute réponse votée. Tout cela parce que les gens ne peuvent pas prendre la peine d'écrire 3 lignes de code pour faire les choses correctement. +1 – hammus
La solution décrite par Piotr n'est en réalité pas aussi compliquée que cela puisse paraître. Voici un exemple où un startupinfo
est passé à une invocation check_call
pour supprimer la fenêtre de la console:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
Depuis les fonctions de confort call
, check_call
et check_output
avant leur **kwargs
au constructeur Popen
, il n'est pas nécessaire d'utiliser Popen
directement.
-1: échoue sur le Mac. – ArtOfWarfare
@ArtOfWarfare Cette question est spécifique à Windows, il n'est donc pas surprenant qu'elle puisse échouer sur d'autres systèmes d'exploitation. Si vous voulez aider, vous devez indiquer l'erreur exacte que vous obtenez sur Mac OS. –
Il s'agit d'un travail complexe (relatif à la quantité de code nécessaire) pour qu'un système (Windows) puisse se comporter de la même manière que les autres, mais dans le processus il casse les autres. Je vais avec 'shell = true' - c'est court, c'est doux, et ça marche sur toutes les plateformes.Oh, et le problème sur Mac (et je suppose que * nix) est qu'il lance une exception sur STARTUPINFO() 'n'étant pas reconnu. – ArtOfWarfare
Il semble que 'os.popen' ne produit pas de fenêtre de console. Le script fonctionne sous 'pythonw'. Pas sûr de tous les cas mais dans mon cas cela fonctionne bien.
os.popen(command)
Les gens sont un peu paresseux ... Je thx @Piotr Dobrogost et @Frank S. Thomas pour leurs réponses.
Je suis venu avec ce code qui est runinng sur Linux et Windows:
import platform
import subprocess
startupinfo = None
if platform.system() == 'Windows':
import _subprocess # @bug with python 2.7 ?
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = _subprocess.SW_HIDE
plus tard ...
args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)
gars Thx;)
De plus: il suffit de noter que la le code suivant utilisant 'call' fonctionne aussi sur Python 2.7 (sous Windows) avec le code 'STARTUPINFO' ci-dessus:
def run_command(cmd, sin, sout):
print "Running cmd : %s"%(" ".join(cmd))
return subprocess.call(cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)
Cela a fonctionné parfaitement pour moi, merci. Je ne comprends pas pourquoi quelqu'un voudrait utiliser shell = True, c'est juste un bug qui attend de se produire. – Whatang
similaires à ce que @firsthand dit, je l'ai lu sur les forums wxPython utilisateur que vous "remplacer" l'application en cours d'exécution en cours, que serait « command.com » ou « cmd.exe », avec pyw.exe ou pythonw.exe lorsque vous utilisez quelque chose comme ce qui suit:
os.execl(sys.executable, *([sys.executable]+sys.argv))
voir another post
Bien que je ne sais pas comment vous serait pipe io dans ce cas.
Je crois que l'un des avantages de cette approche est que vous exécutez votre script plusieurs fois sur la barre des tâches de votre système d'exploitation sans remplir d'icônes CMD. Dans l'autre cas, si vous avez réduit plusieurs CMD dans la barre des tâches et commencez à les fermer, il est impossible de dire quel CMD va avec quel script pythonw.
En relation: [Exécution d'un processus en pythonw avec Popen sans console] (http://stackoverflow.com/q/1813872/95735) –
Je crois que os.system() ouvre un nouveau processus cmd. Essayez os.execl() pour remplacer le nouveau processus cmd avec votre processus pythonw.exe. – DevPlayer