Invocar python bajo CygWin en Windows se bloquea

Al instalar un nuevo sistema de Windows, instalé CygWin y Python de 64 bits (2.7.3) en sus ubicaciones predeterminadas ( c:\cygwin y c:\Python27\python ), y agregué el bin de CygWin y el directorio de Python a mi ruta (en la variable de usuario PATH). Desde la ventana de comando normal, Python se inicia perfectamente, pero cuando lo invoco desde bash en el entorno de CygWin, se cuelga, sin dar nunca el aviso de entrada.

Lo he hecho en otras máquinas, anteriormente, pero siempre con versiones anteriores de Python (32 bits) y CygWin, y con Python en una ubicación decididamente no estándar. ¿Alguien más ha tenido este problema o podría alguien decirme a qué se debe?

El problema es que debido a la forma en que se comporta el terminal de Cygwin (MinTTY), la comstackción nativa de Python para Windows no se da cuenta de que stdout es un dispositivo terminal, cree que es una canalización, por lo que se ejecuta en modo no interactivo del modo interactivo, y amortigua completamente su salida en lugar del búfer de línea.

La razón por la que esto es nuevo es probable porque en su instalación anterior de Cygwin, no tenía MinTTY, y el terminal utilizado era solo el terminal estándar de Windows.

Para solucionar esto, debe ejecutar Python desde un terminal de Windows ( Cmd.exe ) o instalar la versión Cygwin de Python en lugar de una versión nativa de Python para Windows. La versión de Cygwin (instalable como un paquete a través de setup.exe de Cygwin) entiende los terminales de Cygwin y actúa de manera apropiada cuando se ejecuta a través de MinTTY.

Si la versión particular de Python que desea no está disponible como paquete de Cygwin, también puede descargar el código fuente de Python y comstackrlo usted mismo bajo Cygwin. Necesitará una cadena de herramientas del comstackdor Cygwin si aún no tiene una (GCC), pero creo que debería comstackrse con un comando estándar ./configure && make && make install .

Prueba esto

 python -i 

y sí, encontrarán algunos fallos aquí y allá!

Tuve un problema similar con Mercurial (hg) + OpenSSH, Python y MinTTY, pero bajo MSYS en lugar de CygWin. No obstante, por lo que puedo decir, tanto este como mi problema se debieron a que MinTTY no manejaba las aplicaciones que usan las funciones nativas de la consola de Windows (en una respuesta de Adam, él lo explicó en detalle para Python).

Para mí, seguí la solución que se encuentra en el comentario 64 de https://code.google.com/p/mintty/issues/detail?id=56#c64

Con el proyecto winpty ( https://github.com/rprichard/winpty ) comstackdo y en mi camino, pude ejecutar Python nativo (en modo interactivo) y Mercurial desde el shell de MinTTY sin comstackciones ni interruptores especiales (como python -i ). Todo lo que necesito es adjuntar console.exe o console antes del comando python o hg . Para mayor comodidad, agregué alias como alias hg="console.exe hg" para que pueda usar los mismos comandos, ya sea que esté en un shell de Linux o en un shell de Windows MinTTY.

Además, esta solución parece funcionar para más aplicaciones nativas más allá de python y hg. Por ejemplo, ejecutar mysql (con o sin -p ) hubiera dado el mismo problema (por ejemplo, “cuelga” sin un indicador de entrada). Anexar la console a él lo ha permitido como de costumbre.

De acuerdo con https://stackoverflow.com/a/9549255/745913 también puedes probar

 /cydrive/c/Python27/python.exe -i foo.py 

Para administrar ubicaciones no cygwin de diferentes versiones de Python en CygWin:

 $ /usr/sbin/alternatives.exe 

Use las opciones de instalación y configuración aquí, funciona igual que update-alternatives en un sistema Linux. Estoy usando esto junto con el enfoque python -i , y está funcionando bien.

También tuve que eliminar primero los archivos de enlaces simbólicos en /usr/bin , ya que se instalaron con la herramienta Python de CygWin y no se administraron a través de alternative.exe inicialmente.

otra solución universal es invocarlo a través de winpty https://github.com/rprichard/winpty y esto no es realmente un problema específico de python.

Mi solución consistía en escribir un script de shell para ejecutar la aplicación python.

 python file.py "$@" | tee /dev/null 

Ese comando de tee adicional (a ninguna parte) parece solucionar el problema.

Vuelva a instalar mintty con la configuración de cygwin. No tuve que usar python -i después de eso.