Я писал небольшое приложение-утилиту, использующее Python 3 (однако тестовый файл также работает в Python 2, однако) и PyQt 4, который использует модуль code
, чтобы вызвать приглашение REPL, позволяющее взаимодействовать с окном Qt.
К сожалению, я столкнулся с проблемой, которую мне не удалось решить: когда я exit()
приложение, а code
находится внутри input()
(известный как raw_input()
в Python 2.x), мой Linux-терминал впоследствии больше не повторяет введенные символы. То есть терминал, по-видимому, остается в сломанном состоянии, предположительно из-за некоторой escape-последовательности, выданной input()
.
Я испробовал множество подходов, чтобы исправить это, от использования модуля curses
и других средств до reset терминала до запуска 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, это откроет пустое окно, и когда он будет закрыт, соединение с сигналом app
lastWindowClosed
вызовет вызов встроенной функции exit()
, Это происходит, когда модуль code
выполняет вызов input()
для чтения из sys.stdin
. И здесь, когда я закрываю окно, ввод в терминал впоследствии не отображает никаких символов типов.
В основном я использую Python 3, и фактическое приложение использует код Python 3, но я также пробовал тестовый тест в Python 2.7, и он показывает ту же проблему.