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

19
demandé sur ferrangb 2014-07-19 03:23:30

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, utilisez

cmd /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 pythonwprint (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.

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 via print().

  • 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 ou sys.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.
  • 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 que sys.stdoutNone, ainsi que print() les instructions peuvent par défaut être utilisées en toute sécurité - elles seront simplement ignoré lors de l'exécution avec pythonw.exe
    • Toutefois, il s'ensuit que le fait d'essayer d'utiliser sys.stdout.write() et sys.stderr.write() il en résulte toujours une exception.

Voir ici pour plus d'arrière-plan.

23
répondu mklement0 2016-06-16 20:08:33

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.

4
répondu Ross Ridge 2014-07-19 02:37:03

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

2
répondu mfitzp 2015-01-27 20:34:40

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.

1
répondu Amol 2015-01-27 18:05:51

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

-1
répondu Joran Beasley 2014-07-18 23:34:42

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
    
-1
répondu Dark Smile 2017-02-08 08:48:32

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.

-1
répondu akd 2017-07-19 19:38:10