recognized - .pyw y pythonw no se ejecutan en Windows 7
where is python installed on windows (7)
Esta es una respuesta antigua, pero también quiero dejar mi solución aquí:
- Abrir CMD (con privilegios elevados o no, depende de sus necesidades)
- Cambiar al directorio del script .py / .pyw : esto es importante
Ejecute pythonw con script como argumento
cd E:/my/script/folder/ pythonw script.py
La ejecución de un archivo python simple .py o .pyw hace que python.exe
aparezca en el Administrador de tareas.
python myApp.py
python myApp.pyw
Sin embargo, cuando tratamos de ejecutarlo sin usar la consola, la secuencia de comandos no parece ejecutarse, ni python.exe
o pythonw.exe
aparecen bajo el Administrador de tareas
pythonw myApp.pyw
pythonw myApp.py
¿Cómo solucionamos el problema? El sistema ejecuta Python 2.7.8 x64.
No estoy seguro de entender su problema, pero creo que esto es lo que necesita saber
necesita hacer clic derecho en un archivo py o pyw y seleccionar abrir con ... encontrar python.exe (probablemente C: / Python27 / python.exe) ... marcar la casilla que dice siempre abrir ... ahora puede simplemente duplicar haga clic en él si desea ejecutarlo
(generalmente el instalador lo configura para usted ...)
Intente agregar el sistema de import sys; sys.stderr = open("errlog.txt", "w")
línea import sys; sys.stderr = open("errlog.txt", "w")
import sys; sys.stderr = open("errlog.txt", "w")
al inicio de myApp.py
. Luego busque en errlog.txt
un rastreo o cualquier otro mensaje de error.
Enfrenté el mismo problema en un script propio y descubrí que al agregar el resultado de la respuesta de Ross, el script realmente se ejecutaba.
Parece que, por alguna razón, la salida de redireccionamiento soluciona el problema. Como no estoy interesado en escribir el resultado en el disco, lo escribí en /dev/null
(o el equivalente de la plataforma) con:
if ( sys.platform == ''win32'' and sys.executable.split( ''//' )[-1] == ''pythonw.exe''):
sys.stdout = open(os.devnull, ''w'')
sys.stderr = open(os.devnull, ''w'')
La instrucción if garantiza que solo se produce cuando la secuencia de comandos se inicia desde pythonw.exe
. No estoy seguro de si está relacionado, pero era importante hacerlo antes de otras importaciones (incluido, por ejemplo, el import logging
).
Estaba teniendo un problema similar.
Después de depurar paso a paso al escribir en un archivo de registro, descubrí que pythonw.exe se colgó después de una declaración que intentó usar la llamada: sys.stdout.write (). Resulta que, cuando se ejecuta con pythonw.exe, sys.stdout es None.
Si está utilizando las funciones de sys.stdout / stderr / stdin, y tiene la intención de utilizar su programa con pythonw.exe, agregar una marca de "Ninguna" es una buena idea.
tl; dr
Para solucionar problemas , use la redirección de salida en la invocación:
pythonw myApp.py 1>stdout.txt 2>stderr.txt
Esto capturará la salida stdout, como desde print()
, en el archivo stdout.txt
y salida de stderr (como desde excepciones no controladas), en el archivo stderr.txt
; de PowerShell, use
cmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt
).
Tenga en cuenta que el solo hecho de redireccionar stdout puede hacer que su script funcione de nuevo , si la única razón de su falla con pythonw
fue el uso de print
(en Python 2.x - ver más abajo).
Advertencia : esta técnica de redirección de salida aparentemente no funciona cuando se invocan scripts *.pyw
directamente (en lugar de pasar la ruta del archivo de script a pythonw.exe
). Avíseme si sabe por qué y / o si funciona para usted.
- Para arreglar tu script :
Coloque lo siguiente en la parte superior de cualquier secuencia de comandos de Python 2.xo 3.x que desee ejecutar con 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")
Esto garantiza lo siguiente cuando se ejecuta una secuencia de comandos con pythonw.exe
:
-
print()
llamadas aprint()
y las llamadas explícitas asys.stdout()
se ignoran de manera efectiva (no son operaciones). - La salida de Stderr, incluida una excepción fatal no controlada , se envía al archivo
%TEMP%/stderr-<scriptFileName>
;%TEMP%
es una variable de entorno estándar de Windows que apunta a la carpeta del usuario actual para los archivos temporales.
En otras palabras: con el código anterior en su lugar, compruebe el archivo %TEMP%/stderr-<scriptFileName>
después de que su secuencia de comandos haya fallado silenciosamente al invocarse con pythonw.exe
.
Para una explicación, sigue leyendo.
En Windows, pythonw.exe
es para pythonw.exe
GUI / no-UI-at-all, lo que significa que las secuencias estándar de entrada y salida - sys.stdin
, sys.stdout
, sys.stderr
NO están disponibles.
Esto tiene dos efectos secundarios desagradables :
- El uso de
print()
, que se dirige asys.stdout
por defecto, causa una excepción en Python 2.x.- Este problema se ha solucionado en Python 3.x.
- Cualquier excepción no controlada , incluida una activada por
print()
en 2.x, hace que la secuencia de comandos aborte silenciosamente .- Los mensajes de error de excepción van a
sys.stderr
de manera predeterminada, que es lo que no está disponible en este escenario.
- Los mensajes de error de excepción van a
El código anterior soluciona estos problemas de la siguiente manera:
enviando salida stdout al dispositivo nulo, ignorando efectivamente cualquier intento de salida a
sys.stdout
, ya sea explícita o implícitamente a través deprint()
.enviando todos los resultados de stderr a un archivo temporal.
Diferencias entre Python 2.xy Python 3.x:
Cuando se ejecuta un script con pythonw.exe
, sys.stdin
, sys.stdout
y sys.stderr
:
- en Python 2.x : tienen descriptores de archivos no válidos
- El resultado final al intentar escribir en
sys.stdout
osys.stderr
es la siguiente excepción:IOError: [Errno 9] Bad file descriptor
- Peligro: debido al almacenamiento en búfer de salida, esta excepción puede no aparecer hasta que haya emitido, digamos, 4K bytes ; puede provocarlo instantáneamente invocando
pythonw.exe
con-u
(para salida sin búfer). -
print()
intenta ciegamentesys.stdout
(de forma predeterminada), por lo que provoca esta excepción tarde o temprano.
- El resultado final al intentar escribir en
- en Python 3.x : están configurados en
None
- Esto se complementa con la función 3.x
print()
que realiza unasys.stdout
nosys.stdout
(no hacer nada) cuando descubre quesys.stdout
esNone
, por lo queprint()
declaracionesprint()
se pueden utilizar de manera segura y segura: simplemente se ignorarán. cuando se ejecuta conpythonw.exe
- Sin embargo, se deduce que intentar usar
sys.stdout.write()
ysys.stderr.write()
aún genera una excepción.
- Esto se complementa con la función 3.x
Mira aquí para más información.
Tuve un problema similar después de una actualización a la memoria RAM de mi computadora. Resulta que tuve que volver a instalar Pillow (biblioteca utilizada para el procesamiento de imágenes). Por lo tanto, asegúrese de que esté instalado y, de no ser así, instálelo utilizando "Pilip install Pillow" en cmd.