2011-10-29 16 views
15

He estado escribiendo una pequeña aplicación de utilidad usando Python 3 (el caso de prueba a continuación también funciona en Python 2) y PyQt 4 que usa el módulo code para engendrar un mensaje REPL que permite la interacción con una ventana Qt.Terminal en estado interrumpido (texto invisible/sin eco) después de la salida() durante la entrada()/raw_input()

Por desgracia he golpeado un problema que he sido incapaz de resolver: Cuando exit() la aplicación mientras está dentro codeinput() (conocido como raw_input() en Python 2.x), mi terminal Linux posteriormente no hay ecos más largos caracteres escritos. Es decir. el terminal parece quedar en estado roto, presumiblemente debido a alguna secuencia de escape emitida por input().

He intentado una variedad de enfoques para solucionar este problema, el uso del módulo curses y otros medios para restablecer el terminal antes de ejecutar exit, para tratar de emular la corriente stdin para salir por entregándola exit() de entrada() (lamentablemente code.InteractiveConsole.push() no funciona de esa manera, como se podría pensar), al intentar escribir mi propio input() sin bloqueo usando threading, pero no he podido juntar algo que funcione.

Here, here, here y here son conversaciones de problemas similares.

Finalmente, aquí es un caso de prueba reducida para demostrar el problema:

#!/usr/bin/env python3 

import code 
import sys 
from PyQt4.QtGui import QApplication, QWidget 

app = QApplication(sys.argv) 

app.lastWindowClosed.connect(exit) 

widget = QWidget() 
widget.show() 

code.interact() 

Para aquellos familiarizados con (Py) Qt, esto abrirá una ventana en blanco, y cuando está cerrado, la conexión de app ' La señal lastWindowClosed provocará que se produzca una llamada a la función incorporada exit(). Esto ocurre mientras el módulo code está ejecutando una llamada al input() para leer desde sys.stdin. Y aquí, cuando cierro la ventana, escribir en la terminal después no muestra ninguno de los caracteres de los tipos.

Principalmente uso Python 3, y la aplicación real usa el código específico de Python 3, pero también he probado el caso de prueba en Python 2.7 y muestra el mismo problema.

+0

No puedo reproducir el problema en Python26 Win7 de 64 bits. Si cierro el cuadro qt, la consola vuelve a mostrar el mensaje normal y puedo ingresar texto en él. – joaquin

+1

Debería haber mencionado que estoy ejecutando esto en Linux (lo editaré para mencionarlo). El comportamiento del terminal probablemente difiere sustancialmente entre las plataformas. ¡Gracias por revisar, sin embargo! – Sho

Respuesta

15

Esto no es una solución real al problema, pero si escribe "reiniciar" en el terminal después de cerrar la aplicación, vuelve a la normalidad.

Tuve problemas similares una vez cuando desarrollé una aplicación c que no cerraba correctamente una tubería. Tal vez algo similar está sucediendo aquí también.

+0

He encontrado que 'reset' y' tput reset' no son confiables. – Samveen

0

He corrido el mismo problema usando el módulo curses. Usando la otra respuesta en esta página, dejé de lado el problema con import os al comienzo del programa y luego finalicé el programa con os.system('reset').

13

Probar os.system('stty sane'). Se supone que stty sane restablece el eco, y algunas otras cosas aparentemente.

+1

¡Brillante! El comando 'stty sane' está realmente sacando el terminal del modo * raw * sin borrar el terminal, que es lo que sucede cuando se usa el comando' reset'. ¡Gracias! –

+0

De nada. –

+0

Esta respuesta debe ser aceptada. De hecho, resuelve el problema. – udondan

1

La respuesta de Quentin Engles funcionó bien para mí pero, como neófita de Python, no entendí dónde debía ir el stty sane.Después de algo de caza y rascarse la cabeza me di cuenta de que la salida era una referencia al método exit() así que creé exiting() y pasa una referencia a ella:

#!/usr/bin/env python3 

import code 
import sys 
from PyQt4.QtGui import QApplication, QWidget 

def exiting(): 
    os.system('stty sane') 
    exit() 

app = QApplication(sys.argv) 

app.lastWindowClosed.connect(exiting) 

widget = QWidget() 
widget.show() 

code.interact() 
Cuestiones relacionadas