.pyw et pythonw ne fonctionne pas sous Windows 7
De l'exécution d'un simple .py ou .pyw fichier python causes python.exe
à apparaître sous le Gestionnaire des Tâches.
python myApp.py
python myApp.pyw
Cependant, lorsqu'on tente de l'exécuter sans l'aide de la console, le script ne semble pas courir, ni ne python.exe
ou pythonw.exe
apparaît dans le Gestionnaire des Tâches
pythonw myApp.pyw
pythonw myApp.py
Comment pouvons-nous résoudre le problème? Le système est en cours d'exécution Python 2.7.8 x64.
- Vous avez besoin de rediriger
sys.stderr
à un fichier que le premier, sinon le message d'erreur à partir d'une exception non gérée s'est perdu; voir ma réponse.
Vous devez vous connecter pour publier un commentaire.
tl;dr
À résoudre, utilisez redirection de la sortie sur l'invocation:
Cela permettra de capturer des stdout, comme de
print()
, dans le fichierstdout.txt
, et stderr de sortie (par exemple, les exceptions non gérées), dans le fichierstderr.txt
; à partir de PowerShell, utilisationcmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt
).Notez que l'acte même de rediriger stdout peut réellement faire de votre script fonctionne de nouveau, si la seule raison de son échec avec
pythonw
a été l'utilisation deprint
(en Python 2.x - voir ci-dessous).Mise en garde: Cette redirection de la sortie technique apparemment ne pas de travail lors de l'invocation de
*.pyw
scripts directement (par opposition à la en passant le fichier de script de chemin depythonw.exe
). Ne laissez-moi savoir si vous savez pourquoi et/ou si cela fonctionne pour vous.Placer celui-ci au-dessus de tout Python 2.x ou 3.x script que vous souhaitez courir avec
pythonw.exe
:Cela garantit les éléments suivants lors de l'exécution d'un script avec
pythonw.exe
:print()
appels et des appels explicites àsys.stdout()
sont pratiquement ignorées (ne sont-ops).%TEMP%\stderr-<scriptFileName>
;%TEMP%
est une norme variable d'environnement Windows qui pointe à l'utilisateur actuel du dossier pour les fichiers temporaires.En d'autres termes: Avec le code ci-dessus en place, vérifier le fichier
%TEMP%\stderr-<scriptFileName>
après votre script a échoué en silence lorsqu'il est invoqué avecpythonw.exe
.Pour une explication, lire sur.
Sur Windows,
pythonw.exe
est pour le lancement GUI/non-UI-à-tous les scripts, ce qui signifie que l'standard et les flux de sortie -
sys.stdin
,sys.stdout
,sys.stderr
ne sont PAS disponibles.Cela a deux effets secondaires désagréables:
print()
- qui vise àsys.stdout
par défaut - provoque une exception en Python 2.x.print()
en 2.x - force le script pour abandonner silencieusement.sys.stderr
par défaut, ce qui est la chose même pas disponible dans ce scénario.Le code ci-dessus résout ces problèmes en:
l'envoi de la sortie standard sortie vers le périphérique null, effectivement ignorant toute tentative de sortie de
sys.stdout
- que ce soit explicitement ou implicitement, parprint()
.l'envoi de tous les stderr sortie vers un fichier temporaire.
Différences entre Python 2.x et Python 3.x:
Lorsqu'un script est exécuté avec
pythonw.exe
,sys.stdin
,sys.stdout
, etsys.stderr
:sys.stdout
ousys.stderr
est l'exception suivante:IOError: [Errno 9] Bad file descriptor
pythonw.exe
avec-u
(pour mémoire sans tampon de sortie).print()
aveuglément essaie desys.stdout
(par défaut), de sorte qu'il provoque cette exception tôt ou tard.None
print()
fonction de l'exécution d'une no-op (ne rien faire) lorsqu'il constate quesys.stdout
estNone
, de sorte queprint()
états par défaut en toute sécurité être utilisés, ils vont tout simplement être ignoré lors de l'exécution avecpythonw.exe
sys.stdout.write()
etsys.stderr.write()
encore d'obtenir une exception.Voir ici pour plus d'arrière-plan.
Essayez d'ajouter la ligne
import sys; sys.stderr = open("errlog.txt", "w")
le début demyApp.py
. Puis regardez danserrlog.txt
pour un traceback ou tout autres messages d'erreur.J'ai connu le même problème sur un script de ma propre et a constaté que lors de l'ajout de la sortie de Ross réponse le script exécuté.
Il apparaît que, pour quelque raison que redirection de la sortie résout le problème. Depuis que je ne suis pas intéressé par l'écriture de la sortie du disque, j'ai plutôt écrit à
/dev/null
(ou de la plate-forme équivalent) avec:L'instruction si l'assure, il ne se produit que lorsque le script est lancé à partir de
pythonw.exe
. Je ne sais pas si c'est lié mais il était important de le faire avant les autres importations (y compris, par exemple,import logging
).pythonw.exe
,sys.stdin
,sys.stdout
, etsys.stderr
ont soit valide descripteurs de fichiers (2.x) , ou sontNone
(3.x). Cependant, je vous suggère de redirection stderr pour un fichier réel, de sorte que si votre script meurt en raison d'une exception non gérée, vous pouvez au moins savoir pourquoi.J'ai eu le même problème.
Après le débogage pas à pas par écrit dans un fichier journal, j'ai découvert que pythonw.exe s'est écrasé après une déclaration qui a essayé d'utiliser l'appel: sys.la sortie standard stdout.write(). Il s'avère, lors de l'exécution avec pythonw.exe sys.stdout n'est.
Si vous utilisez les fonctions de sys.stdout/stderr/stdin, et l'intention d'utiliser votre programme avec pythonw.exe, l'ajout d'une case à cocher pour "Aucun" est une bonne idée.
Je ne suis pas sûr de comprendre votre problème, mais je pense que c'est ce que vous devez savoir
vous avez besoin de faire un clic droit sur un py ou pyw fichier et sélectionnez ouvrir avec ... trouver python.exe (probablement C:\Python27\python.exe) .. cochez la case toujours ouvrir ... maintenant vous pouvez simplement double-cliquez dessus si vous voulez l'exécuter
(généralement de l'installateur définit cette place pour vous ...)
pythonw.exe
plutôt quepython.exe
.C'est une vieille réponse, mais je veux laisser ma solution ici aussi:
Exécuter pythonw avec un script comme argument
J'ai eu un problème similaire après une mise à niveau de mon mémoire RAM de l'ordinateur. S'avère que j'ai dû réinstaller Oreiller (bibliothèque utilisée pour le traitement de l'image). Donc, assurez-vous qu'il est installé et si elle n'est pas l'installer à l'aide de "pip install Oreiller" dans cmd.