Invocando python bajo CygWin en Windows cuelga
(8)
De acuerdo con https://stackoverflow.com/a/9549255/745913 también puedes probar
/cydrive/c/Python27/python.exe -i foo.py
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 RUTA). Desde la ventana de comando normal, Python se inicia perfectamente, pero cuando lo invoco desde bash
en el entorno CygWin, se cuelga, nunca dando mi mensaje de entrada.
He hecho esto 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 alguien podría decirme a qué se debe?
El problema es que debido a la forma en que se comporta la terminal Cygwin (MinTTY), la versión nativa de Windows de Python no se da cuenta de que stdout es un dispositivo terminal: cree que es un conducto, por lo que se ejecuta en modo no interactivo del modo interactivo, y almacena por completo su salida en lugar de almacenarla en la memoria intermedia de la línea.
La razón por la cual 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 normal ( Cmd.exe
) o instalar la versión Cygwin de Python en lugar de una versión nativa de Windows de Python. La versión de Cygwin (que se puede instalar como un paquete a través de setup.exe
de Cygwin) comprende los terminales 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 un paquete de Cygwin, entonces también puede descargar el código fuente de Python y compilarlo usted mismo bajo Cygwin. Necesitarás una cadena de herramientas para el compilador de Cygwin si aún no tienes una (GCC), pero luego creo que debería compilarse con un comando ./configure && make && make install
estándar.
Mi solución consistió en escribir un script de shell para ejecutar la aplicación de Python.
python file.py "$@" | tee /dev/null
Ese comando de T adicional (a ninguna parte) parece solucionar el problema.
Otra solución universal es invocarlo a través de winpty
https://github.com/rprichard/winpty
Para gestionar ubicaciones que no sean cygwin de diferentes versiones de Python en CygWin:
$ /usr/sbin/alternatives.exe
Use las opciones --install y --config 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 sym-link en /usr/bin
, ya que se instalaron con CygWin''s python y no se administraron mediante alternatives.exe inicialmente.
Prueba esto
python -i
y sí, encontrarás algunas fallas aquí y allá.
Tuve un problema similar con Mercurial (hg) + OpenSSH, Python y MinTTY, pero bajo MSYS en lugar de CygWin. Sin embargo, por lo que puedo decir, tanto este como mi problema fueron causados por MinTTY que no manejaba las aplicaciones que usan las funciones nativas de la consola de Windows (en una respuesta aquí de Adam, la 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 ) compilado y en mi camino, pude ejecutar Python nativo (en modo interactivo) y Mercurial desde el shell MinTTY sin compilaciones especiales o interruptores (como python -i
). Todo lo que necesito es agregar 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 bash.
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
) habría dado el mismo problema (por ejemplo, "se cuelga" sin solicitud de entrada). Al agregar la console
a él, se lo permitió como de costumbre.
Vuelva a instalar mintty con la configuración de cygwin. No tuvo que usar Python -i después de eso.