.pyw et pythonw ne s'exécute pas sous Windows 7
en cours d'Exécution simple .py ou .pyw causes du fichier python python.exe
pour apparaître sous le Gestionnaire des tâches.
python myApp.py
python myApp.pyw
cependant quand nous essayons de l'exécuter sans utiliser la console, le script ne semble pas s'Exécuter, pas plus que python.exe
ou pythonw.exe
apparaît sous Gestionnaire des tâches
pythonw myApp.pyw
pythonw myApp.py
Comment résoudre le problème? Le système exécute Python 2.7.8 x64.
7 réponses
tl;dr
résolution de problèmes, utilisez redirection de sortie sur l'invocation:
pythonw myApp.py 1>stdout.txt 2>stderr.txt
cela capturera la sortie stdout, telle queprint()
dans le fichier stdout.txt
, et stderr de sortie (par exemple, les exceptions non gérées), dans le fichier stderr.txt
; à partir de PowerShell, utilisezcmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt
).
Notez que le fait même de rediriger stdout peut réellement faire votre script fonctionne de nouveau,si la seule raison de son échec avec pythonw
print
(en Python 2.x - voir ci-dessous).
Avertissement: cette technique de redirection de sortie semble faire travail lors de l'appel de *.pyw
scripts directement (au lieu de passer le chemin du fichier script à pythonw.exe
). Ne laissez-moi savoir si vous savez pourquoi et/ou si cela fonctionne pour vous.
- à correction de votre script:
placez ce qui suit au sommet de N'importe quel Python 2.x ou 3.x script que vous voulez exécuter pythonw.exe
:
import sys, os
if sys.executable.endswith("pythonw.exe"):
sys.stdout = open(os.devnull, "w");
sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")
ceci assure ce qui suit quand un script est exécuté avec pythonw.exe
:
print()
appels et appels explicites àsys.stdout()
sont effectivement ignorées (ne sont pas-ops).- sortie Stderr, y compris d'une exception fatale non accompagnée, est envoyé au fichier
%TEMP%\stderr-<scriptFileName>
;%TEMP%
est une variable D'environnement Windows standard qui pointe vers le dossier de l'utilisateur courant pour les fichiers temporaires.
En d'autres termes: Avec le code ci-dessus en place, vérifier le fichier %TEMP%\stderr-<scriptFileName>
après que votre script a échoué silencieusement lorsqu'il est invoqué avec pythonw.exe
.
Pour une explication, lire sur.
Sur Windows, pythonw.exe
est pour lancer des scripts GUI/no-UI-at-all, ce qui signifie que la
standard et les flux de sortie - sys.stdin
,sys.stdout
,sys.stderr
ne sont pas disponibles.
C'est deux effets secondaires désagréables:
- en utilisant
print()
- quelles ciblessys.stdout
- provoque une exception en Python 2.x.- ce problème a été corrigé en Python 3.x.
- toute exception non entravée - dont une déclenchée par
print()
en 2.x-provoque le script à annuler silencieusement.- messages D'erreur D'Exception passez à
sys.stderr
par défaut, ce qui est la chose même pas disponible dans ce scénario.
- messages D'erreur D'Exception passez à
le code ci-dessus corrige ces problèmes par:
envoi de la sortie stdout au périphérique null, ignorant effectivement toute tentative de sortie à
sys.stdout
- soit explicitement, soit implicitement viaprint()
.envoi de toutes les sorties stderr dans un fichier temporaire.
différences entre Python 2.x et Python 3.x:
Quand un script est exécuté avec pythonw.exe
,sys.stdin
,sys.stdout
et sys.stderr
:
- en Python 2.x:valide descripteurs de fichiers
- éventuelle résultat en essayant d'écrire à
sys.stdout
ousys.stderr
est l'exception suivante:IOError: [Errno 9] Bad file descriptor
- Écueil: en raison de la mise en mémoire tampon de la sortie, cette exception peut ne pas faire surface tant que vous n'aurez pas sorti, disons, des octets 4K;, vous pouvez provoquer instantanément en invoquant
pythonw.exe
-u
(pour la sortie non tamponnée). print()
aveuglément essaie d'sys.stdout
(par défaut), donc il provoque cette exception tôt ou tard.
- éventuelle résultat en essayant d'écrire à
- en Python 3.x:
None
- il est complété par le 3.x
print()
fonction effectuant un no-op (ne rien faire) lorsqu'il constate quesys.stdout
None
, ainsi queprint()
les instructions peuvent par défaut être utilisées en toute sécurité - elles seront simplement ignoré lors de l'exécution avecpythonw.exe
- Toutefois, il s'ensuit que le fait d'essayer d'utiliser
sys.stdout.write()
etsys.stderr.write()
il en résulte toujours une exception.
- il est complété par le 3.x
Voir ici pour plus d'arrière-plan.
Essayez d'ajouter la ligne import sys; sys.stderr = open("errlog.txt", "w")
pour le début de l' myApp.py
. Puis regardez dans errlog.txt
pour un traceback ou tout autre message d'erreur.
j'ai fait face au même problème sur un script de mon cru et j'ai découvert que lorsque J'ajoutais la sortie de la réponse de Ross, le script fonctionnait.
il semble que pour une raison quelconque, la redirection de la sortie corrige le problème. Puisque je ne suis pas intéressé à écrire la sortie sur le disque, je l'ai écrit à la place à /dev/null
(ou l'équivalent de la plateforme) avec:
if ( sys.platform == 'win32' and sys.executable.split( '\' )[-1] == 'pythonw.exe'):
sys.stdout = open(os.devnull, 'w')
sys.stderr = open(os.devnull, 'w')
la déclaration if garantit que cela ne se produit que lorsque le script est lancé à partir de pythonw.exe
. Je ne suis pas sûr si c'est lié, mais il était important de le faire avant les autres importations (y compris par exemple import logging
).
j'avais le même problème.
après avoir débogué pas à pas en écrivant 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.écrire.)( Il s'avère, quand courir avec pythonw.exe, sys.stdout n'est.
si vous utilisez des fonctions sys.stdout/stderr/stdin, et l'intention d'utiliser votre programme avec pythonw.exe, ajouter un chèque 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 devez cliquer avec le bouton droit de la souris sur un fichier PY ou pyw et sélectionner 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 le programme d'installation définit pour vous ...)
C'est une vieille réponse, mais je veux laisser ma solution ici aussi:
- ouvrir CMD (avec privilèges élevés ou non-dépend de vos besoins)
- changement au répertoire de .py/.pyw script - c'est important
Exécuter pythonw avec un script comme argument
cd E:\my\script\folder\ pythonw script.py
j'ai eu un problème similaire après une mise à jour de ma mémoire vive. Il s'avère que j'ai dû réinstaller Pillow (bibliothèque utilisée pour le traitement d'image). Alors assurez-vous qu'il est installé et si ce n'est pas le cas, installez-le en utilisant "pip install Pillow" dans cmd.