[python] Terminale in stato di errore (testo invisibile / senza eco) dopo exit () durante input () / raw_input ()


Answers

Prova os.system('stty sane') . Si suppone che lo stty sane resetta l'eco e alcune altre cose apparentemente.

Question

Ho scritto una piccola applicazione di utilità usando Python 3 (la sotto testcase funziona anche in Python 2, comunque) e PyQt 4 che usa il modulo di code per generare un prompt REPL che consente l'interazione con una finestra Qt.

Purtroppo ho riscontrato un problema che non sono stato in grado di risolvere: quando raw_input() dall'app mentre il code è all'interno di input() (noto come raw_input() in Python 2.x), il mio terminale Linux in seguito non ha più echi digitati personaggi. Cioè il terminale sembra essere lasciato in uno stato rotto, presumibilmente a causa di una sequenza di escape emessa da input() .

Ho provato una varietà di approcci per risolvere questo problema, dall'uso del modulo curses e altri mezzi per resettare il terminale prima di eseguire exit , per provare ad emulare lo stdin stream per uscire passando effettivamente exit() a input () (unfornunately code.InteractiveConsole.push() non funziona in questo modo, come si potrebbe pensare che sarebbe), per provare a scrivere il mio input() non bloccante input() utilizzando il threading , ma non sono riuscito a riunire qualcosa che funzioni.

Qui , qui , qui e qui ci sono discussioni su problemi simili.

Infine, ecco un testcase ridotto per dimostrare il 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()

Per coloro che non hanno familiarità con (Py) Qt, questo aprirà una finestra vuota e, una volta chiusa, la connessione dal segnale lastWindowClosed app lastWindowClosed l' lastWindowClosed una chiamata alla funzione built-in exit() . Ciò si verifica mentre il modulo di code sta eseguendo una chiamata a input() per leggere da sys.stdin . E qui, quando chiudo la finestra, digitando il terminale in seguito non viene mostrato nessuno dei tipi caratteri.

Sto principalmente usando Python 3, e l'app reale usa il codice specifico per Python 3, ma ho provato anche il test in Python 2.7 e mostra lo stesso problema.




Ho eseguito lo stesso problema usando il modulo curses. Usando l'altra risposta in questa pagina, ho aggirato il problema con import os all'inizio del programma, e poi terminando il programma con os.system('reset') .