2010-07-14 21 views
58

He estado usando Cygwin en Windows recientemente. Quiero utilizar la instalación de Windows de Python, por lo que durante las pruebas estoy usando /cygdrive/c/Python26/python.exe myfile.py en lugar de python myfile.exe.Usando Windows Python desde Cygwin

Esto funciona casi a la perfección, excepto en el caso de la impresión. Cuando ejecuto Windows Python desde Cygwin, la salida no se imprime hasta que finaliza la ejecución. Funciona bien en Windows Python desde explorer.exe o cmd.exe, y funciona en Cygwin utilizando el Python instalado por Cygwin (/bin/python.exe).

¿Existe una solución para esto? Lo importante es poder ejecutar la versión de Windows, pero me gustaría hacerlo todo con Bash.

+1

hicieron intenta lanzar el bash.exe desde una ventana de DOS? Creo que esto resolverá sus problemas sin tener la necesidad de usar la opción -i o la variable PYTHONUNBUFFERED. Avísame si te funciona. – fixxxer

+0

relacionados: https://stackoverflow.com/questions/13588454/invoking-python-under-cygwin-on-windows-hangs – Gwen

Respuesta

21

Tal vez si se enjuaguen la salida

import sys 

V = range(100000) 
for x in V: 
    print x 
    sys.stdout.flush() 
+1

Bueno, whaddya sabe - funcionó, gracias! – Skilldrick

107

El verdadero problema es que cuando se ejecuta un comando en cualquiera de los programas de terminal de Cygwin como mintty, no actúan como ventanas Consolas. Solo las basadas en Windows Console como CMD o Console2 hacen eso. Entonces, con los terminales Cygwin, el python.exe de Windows no cree que esté hablando con una consola interactiva.

Esto lleva a la salida de almacenamiento en búfer en lugar de vaciar los almacenamientos intermedios en cada línea como se hace en las sesiones interactivas. Esa es la razón por la cual Amro agrega el color() en cada línea y corrige el síntoma, pero significa cambiar el código.

Una solución sin cambiar el código es desactivar el almacenamiento en búfer en Python usando el indicador '-u' en la línea de comando o estableciendo la variable de entorno PYTHONUNBUFFERED.

export PYTHONUNBUFFERED=1 

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

o

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

o ejecutar en modo interactivo

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

También no será capaz de ejecutar el modo interactivo python.exe de Windows en el terminal de Cygwin. No mostrará una sesión interactiva, sino que se bloqueará. Me parece la mejor solución parece ser el uso de 'cygstart' (mejor que utilizar la opción '-i'):

cygstart /cygdrive/c/Python27/python.exe 

Y eso parece trabajar con ipython también (si está instalado):

cygstart /cygdrive/c/Python27/Scripts/ipython.exe 
+0

Gran respuesta. Por cierto, no tengo un 'Python27/Scripts/ipython.exe' en mi instalación ... – wap26

+1

No viene con Python a menos que instales algo así como Enthought Python Distribution. Puede instalarlo para Windows usando easy_install o descargando desde aquí: http://pypi.python.org/pypi/ipython – noisygecko

+1

Esto es muy útil. Una nota: si presiono Ctrl + C para matar el programa, en mintty todavía no veo el traceback. Con cygstart, Ctrl + C no parece funcionar. En su lugar, utilizo un shell bash Cygwin que se ejecuta desde el terminal de Windows (aunque esto no puede interpretar algunos códigos de control correctamente). –

34

No respondiendo la pregunta inicial, pero para aquellos que quieran usar sesión interactiva Python desde el terminal Cygwin (por ejemplo en mintty) - inicie Python con la opción "-i" para decirle explícitamente que necesita ejecutarse modo interactivo:

$ python -i 

La manera ordenada es también crear un alias en su .bashrc (sabiendo que sólo se lee para sesiones de terminal interactivo de todos modos):

alias python='python -i' 

De lo contrario, Python no sabrá que se ejecute en la consola , porque todos los terminales basados ​​en cygwin pty (mintty, rxvt y xterm) son reconocidos como conductos por Windows, no como la consola. Por lo tanto, Python piensa que no hay consola y entra en modo no interactivo. Por lo tanto, si aún desea el modo interactivo, debe indicar explícitamente a Python que lo use.Sin embargo, todavía no se comportará como debería, uno aún no podrá usar las teclas de DIRECCIÓN HACIA ARRIBA o IZQUIERDA, y así sucesivamente.

+4

¿Por qué no podemos usar las teclas de FLECHA HACIA ARRIBA o IZQUIERDA? ¿Hay alguna manera de arreglar eso? – bourbaki4481472

+0

@Timur: Esta es la respuesta que estaba buscando. Gracias por el comando. Agregarlo a bash_profile resuelve el problema, pero hace que cada llamada a python sea interactiva en cygwin. Gracias de nuevo por la solución realmente ayuda. – Doogle

Cuestiones relacionadas