2009-11-19 13 views
11

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?

+0

En relation: [Exécution d'un processus en pythonw avec Popen sans console] (http://stackoverflow.com/q/1813872/95735) –

+0

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

Répondre

5

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.

+1

subprocess.check_call remplace dans ce cas os.system. – esm

+0

Cela a fonctionné ... Merci! – twneale

+1

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

13

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.

+0

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

+1

Utiliser 'shell = True' n'est pas la bonne chose à faire ici et la complexité (supposée) de la bonne solution ne change pas cela. –

+2

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

13

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.

+0

-1: échoue sur le Mac. – ArtOfWarfare

+2

@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. –

+0

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

1

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) 
7

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) 
+0

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

0

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.