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