Терминал в сломанном состоянии (невидимый текст / без эха) после выхода () во время ввода () / raw_input ()

Я пишу небольшое приложение-утилиту, использующее Python 3 (ниже тестовый файл также работает в Python 2, однако) и PyQt 4, который использует модуль code чтобы вызвать приглашение REPL, позволяющее взаимодействовать с окном Qt.

К сожалению, я столкнулся с проблемой, которую мне не удалось решить: когда я raw_input() приложение, а code находится внутри input() (известный как raw_input() в Python 2.x), мой Linux-терминал впоследствии больше не повторяет ввод персонажи. Т.е. терминал, по-видимому, остается в сломанном состоянии, предположительно из-за некоторой escape-последовательности, выдаваемой input() .

Я испробовал множество подходов, чтобы исправить это, от использования модуля curses и других средств для сброса терминала до запуска exit , чтобы попытаться эмулировать поток stdin для выхода, фактически передав exit() для ввода () (к сожалению code.InteractiveConsole.push() не работает таким образом, как можно было бы подумать), чтобы попытаться написать собственный неблокирующий input() с помощью threading , но мне не удалось собрать что-то работающее.

Здесь , здесь , здесь и здесь обсуждаются аналогичные проблемы.

Наконец, здесь приведен пример теста, чтобы продемонстрировать проблему:

 #!/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() 

Для тех, кто не знаком с (Py) Qt, это откроет пустое окно, и когда оно будет закрыто, соединение с lastWindowClosed сигналом app lastWindowClosed вызовет вызов функции встроенного exit() . Это происходит, когда модуль code выполняет вызов input() для чтения из sys.stdin . И здесь, когда я закрываю окно, при вводе в терминал после этого не отображается ни один из типов символов.

В основном я использую Python 3, и фактическое приложение использует код Python 3, но я также пробовал тестовый тест в Python 2.7, и он показывает ту же проблему.

Это не является реальным решением проблемы, но если вы наберете «reset» в терминале после закрытия приложения, он вернется к норме.

У меня были подобные проблемы, когда вы разрабатывали приложение ac, которое не закрывало трубку правильно. Возможно, что-то подобное происходит и здесь.

Попробуйте os.system('stty sane') . Предполагается, что stty sane будет сбросить эхо и некоторые другие вещи.

Я столкнулся с той же проблемой, используя модуль curses. Используя другой ответ на этой странице, я обошел проблему с import os в начале программы, а затем закончил программу с os.system('reset') .

Ответ от Квентина Энглса тоже работал для меня, но, как неофит на Питоне, я не понимал, куда должен был идти пожизненный разум . После некоторой охоты и царапин на голове я понял, что выход был ссылкой на метод exit() поэтому я создал exit() exiting() и передал ссылку на него:

 #!/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()