El terminal OS-X se comporta de manera extraña después de ejecutar Python interactivamente

11

Después de ejecutar una respuesta de Python (2.7.10) en el terminal os-x y salir, el terminal ya no hace eco de la entrada escrita y ocurren otras cosas extrañas. Si corro de pythonnuevo y exit(), entonces, la terminal parece estar restaurada. Ahora solo cierro la pestaña y abro una nueva, así que no lo he probado exhaustivamente.

Supongo que esto está relacionado con la configuración del terminal, pero es algo reciente y no he cambiado nada de lo que recuerdo. Python se instala con macports, si hay algo que ver con dependencias mal emparejadas con alguna biblioteca de consola. 2.7.10 se instaló hace un tiempo, y esto no sucedió después de la instalación.

Rompe nudillos y se abreterminal

[~]: virtualenv-2.7 venv-test
[~]: source venv-test/bin/activate
[~]: python
>>> ^D>>>       *(press ctrl-d, the 2nd >>> is strange)
[~]:            *(type something like `ls-l`, nothing shows on console)
[~]: -bash: ls-l: command not found`

Además, ejecutar Python nuevamente y obtener ctrl-dresultados en esta salida:

>>> ^D           (ctrl-d, then hit enter, doesn't exit)
>>> ^D           (...)
>>> ^D           (...)
>>> exit()       (typing exit() quits the session)
>>> [~]: 
Andrew Backer
fuente
¿Por qué estás instalando Python a través de macports? Python v2.7.10 está incluido con El Cap, y creo que Yosemite ... ¿Hay algo en particular que estás obteniendo de Mac Ports?
Benjamin Schollnick
Bueno, usando 2.7.anything mayor que lo que se envió con mac. No toca el sistema python (problema estándar en unixes), ejecuta 2.7 con opciones GIS personalizadas compiladas, con paquete de gestión para esos, así como 3.4 al mismo tiempo. Pero la verdadera razón por la que debes hacerlo es no jugar con el sistema python.
Andrew Backer
¿La aplicación python está haciendo algún tipo de gestión de ventanas? (p. ej., usando maldiciones, maldiciones, etc.)
Benjamin Schollnick
No hay aplicación, solo escribe pythony luegoctrl-d
Andrew Backer

Respuestas:

12

Hay un error abierto en MacPorts sobre este tema:

https://trac.macports.org/ticket/48807

Dice que instalar Python con la opción "+ readline" soluciona el problema, que verifiqué haciéndolo yo mismo.

sudo port uninstall python27
sudo port install python27 +readline
B. playa
fuente
99
Maldición, gracias por encontrar ese informe de error. FWIW, no es posible desinstalar python27 (normalmente, demasiados paquetes dependen de él), por lo que debería reconstruir en su lugar. Ejecutar sudo port selfupdate && sudo port clean python27 && sudo port install python27 +readline. Si su árbol local está desactualizado, entonces no tendrá disponible la variante + readline; El selfupdatelo arreglará.
Andrew Backer
8

La aplicación establece los modos de terminal en raw o cbreak, y cuando sale anormalmente, los modos no se restauran. En particular, la función que asigna la Enterclave (control / M también conocido como retorno de carro) a nueva línea (control / J también conocido como avance de línea) a menudo se desactiva en este caso. Puede solucionar el problema con las devoluciones ingresando

stty sane

seguido por controlJ

Eso al menos le permitirá ingresar comandos nuevamente, aunque los caracteres de edición como los que backspaceno se pueden asignar a sus funciones habituales.

Algunos también pueden recomendar el uso del resetcomando, pero los síntomas dados no son relevantes para lo que hace ese programa.

Para leer más

Thomas Dickey
fuente
stty echoparece solucionar el problema ( stackoverflow.com/questions/32475928/python3-messes-up-terminal ). No estoy seguro si se encarga de todo. Creo que algunas cosas están un poco mal con mi python, ya que los errores de sintaxis requieren que presione manualmente nueva línea para comenzar a ingresar un nuevo comando, y no debería ser así.
Andrew Backer
Aunque esto no soluciona el problema, al menos me permite solucionarlo después del hecho. Eso es lo suficientemente bueno para mí, por ahora. Si hay alguna forma de averiguar por qué sucede esto, me encantaría saberlo.
Andrew Backer