Terminal in gebrochenem Zustand (unsichtbarer text / no echo) nach dem exit() beim input() / raw_input()
Ich Schreibe eine kleine Anwendung mit Python 3 (die unten testcase funktioniert auch in Python 2, aber) und PyQt 4 verwendet, die code
Modul zum laichen einen REPL-prompt ermöglicht die Interaktion mit einem Qt-Fenster.
Leider habe ich ein problem haben, ich habe nicht in der Lage zu lösen: Wenn ich exit()
die app während code
innerhalb input()
(bekannt als raw_input()
in Python 2.x) mein Linux-terminal anschließend nicht mehr Echos eingegebenen Zeichen. I. e. das terminal erscheint Links in einem Defekten Zustand befindet, vermutlich weil einige escape-Sequenz, ausgegeben von input()
.
Habe ich versucht eine Vielzahl von Ansätzen, um dieses Problem zu lösen, die aus der Verwendung der curses
Modul und setzen Sie das terminal zurück, bevor Sie unter exit
, zu versuchen, zu emulieren, die stdin
stream zu beenden, indem er tatsächlich die übergabe exit()
zur input () - (unfornunately code.InteractiveConsole.push()
funktioniert nicht so, wie man denken könnte, es würde), zu versuchen, zu schreiben, meine eigenen, nicht-blockierende input()
mit threading
, aber ich habe nicht in der Lage an einem Strang zu ziehen, etwas zu arbeiten.
Hier, hier, hier und hier sind Diskussionen über ähnliche Probleme.
Schließlich, hier ist eine reduzierte testcase um das problem zu demonstrieren:
#!/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()
Für diejenigen, die nicht mit (Py)Qt, es öffnet sich ein leeres Fenster, und wenn es geschlossen ist, wird die Verbindung von app
's lastWindowClosed
signal bewirkt, dass ein Aufruf der built-in exit()
- Funktion zu passieren. Dieses tritt auf, während der code
Modul ausgeführt wird, den einen Anruf zu input()
Lesen von sys.stdin
. Und hier, wenn ich das Fenster schließen, die Eingabe in das terminal danach nicht zeigen, die Typen, die Charaktere.
Bin ich hauptsächlich mit Python 3, und die eigentliche app verwendet Python 3-spezifischen code, aber ich habe versucht den testcase in Python 2.7 als auch, und es zeigt das gleiche problem.
- Ich kann nicht reproduzieren Sie das problem im win7-64bit python26. Wenn ich in der Nähe der qt-Rahmen-die Konsole bringt wieder die normale Eingabeaufforderung und ich kann text eingeben, der auf es.
- Ich sollte erwähnt haben, dass ich laufen unter Linux (ich werde Bearbeiten, zu erwähnen, dass). Das terminal Verhalten wahrscheinlich unterscheidet sich wesentlich zwischen den Plattformen. Vielen Dank für die überprüfung, aber!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen
os.system('stty sane')
. Diestty sane
soll zurücksetzen echo, und einige andere Dinge, scheinbar.stty sane
Befehl ist ja auch immer das terminal aus dem roh - Modus, ohne löschen des Terminals selbst, das ist, was passiert, wenn diereset
Befehl. Danke!import os
erstes 😉 ... One-liner zum einfügen in eine defekte terminal istimport os; os.system('stty sane')
raw_input()
. Ich glaube nicht einmal, er konnte es tun, ohne den Kern von python, die geändert wird, nur für diesen Zweck. Vielleicht ein Modul geschrieben in C könnte es tun. Oder ein Problem, was darauf hindeutet Unterstützung für das vorgelegt werden könnte, um das python-repo.stty sane
(obwohl ich ihn nicht sehen kann) und alles ist fein.Dies ist keine wirkliche Lösung für das problem, aber
wenn Sie "reset" in der Klemme, nachdem Sie geschlossen haben, die app, es geht zurück zu normal.
Ich hatte ähnliche Probleme mal bei der Entwicklung einer c-Anwendung, die nicht schließen Sie ein Rohr richtig.
Vielleicht so etwas ähnliches passiert hier auch.
reset
undtput reset
sind beide nicht zuverlässig.Die Antwort von Quentin Engels war für mich auch, aber als Python-Neuling habe ich nicht verstanden, wo die
stty sane
gehen sollte. Nach einigen Jagd-und Kopf-kratzen habe ich herausgefunden, dass die Ausfahrt war ein Verweis auf dieexit()
Methode, so habe ichexiting()
und übergeben Sie eine Referenz zu:Ich habe dasselbe problem mit der curses-Modul. Die andere Antwort auf dieser Seite habe ich umgangen, das problem mit
import os
am Anfang des Programms, und dann endet das Programm mitos.system('reset')
.