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

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

К сожалению, я столкнулся с проблемой, которую не смог решить: когда я exit () приложение, а код находится внутри input () (известный как raw_input () в Python 2.x), мой терминал 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 вызовет вызов встроенной функции exit () . Это происходит, когда модуль code выполняет вызов input () для чтения из sys.stdin .И здесь, когда я закрываю окно, при последующем вводе в терминал не отображаются какие-либо символы типов.

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

17
задан Community 23 May 2017 в 12:25
поделиться