Терминал в поврежденном состоянии (невидимый текст / без эха) после exit () во время input () / raw_input () - PullRequest
17 голосов
/ 29 октября 2011

Я писал небольшое служебное приложение, использующее 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, и он показывает ту же проблему.

Ответы [ 4 ]

20 голосов
/ 16 июля 2014

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

19 голосов
/ 29 октября 2011

Это не является реальным решением проблемы, но если после закрытия приложения вы наберете «reset» в терминале, оно вернется к нормальной жизни.приложение, которое не закрыло трубу правильно.Может быть, что-то подобное происходит и здесь.

1 голос
/ 23 ноября 2016

Ответ от Квентин Энглз тоже работал для меня, но я неофит Python и не понимал, куда должен идти stty sane. После некоторой охоты и царапин на голове я понял, что выход - это ссылка на метод 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()
0 голосов
/ 19 мая 2012

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

...