Python 输入过程中退出()后,终端处于断开状态(不可见文本/无回声)(/raw_input()

Python 输入过程中退出()后,终端处于断开状态(不可见文本/无回声)(/raw_input(),python,terminal,python-3.x,pyqt,pyqt4,Python,Terminal,Python 3.x,Pyqt,Pyqt4,我一直在使用Python3(下面的测试用例也适用于Python2)和Pyqt4编写一个小型实用程序应用程序,它使用code模块生成一个REPL提示符,允许与Qt窗口交互 不幸的是,我遇到了一个无法解决的问题:当我exit()应用程序,而code位于input()(在Python 2.x中称为raw\u input())内时,我的Linux终端随后不再回显键入的字符。即,终端似乎处于断开状态,可能是由于input()发出的某些转义序列 我尝试了多种方法来解决这个问题,从在运行exit之前使用cur

我一直在使用Python3(下面的测试用例也适用于Python2)和Pyqt4编写一个小型实用程序应用程序,它使用
code
模块生成一个REPL提示符,允许与Qt窗口交互

不幸的是,我遇到了一个无法解决的问题:当我
exit()
应用程序,而
code
位于
input()
(在Python 2.x中称为
raw\u input()
)内时,我的Linux终端随后不再回显键入的字符。即,终端似乎处于断开状态,可能是由于
input()
发出的某些转义序列

我尝试了多种方法来解决这个问题,从在运行
exit
之前使用
curses
模块和其他方法重置终端,到尝试通过实际将
exit()
交给input()(不幸的是
code.InteractiveConsole.push())来模拟
stdin
流以退出
没有像人们可能认为的那样工作),尝试使用
线程编写自己的非阻塞
input()
,但我一直无法完成一些工作

,并讨论类似的问题

最后,这里是一个简化的测试用例来演示问题:

#!/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
时,会发生这种情况。在这里,当我关闭窗口时,在终端中键入之后不会显示任何类型的字符


我主要使用Python3,实际的应用程序使用Python3特定的代码,但我也尝试了Python2.7中的testcase,它显示了相同的问题。

这不是问题的真正解决方案,但是 如果在关闭应用程序后在终端中键入“重置”,它将恢复正常

我曾经在开发没有正确关闭管道的c应用程序时遇到过类似的问题。
也许这里也发生了类似的事情。

我在使用curses模块时遇到了同样的问题。使用本页上的另一个答案,我在程序开始时避开了导入操作系统的问题,然后在程序结束时使用操作系统('reset')

尝试操作系统('stty sane')。
stty-sane
应该会重置echo,还有一些其他的东西。这个答案对我来说也很有用,但是作为一个Python新手,我不知道
stty-sane
应该去哪里。经过一番搜寻和挠头之后,我发现exit是对
exit()
方法的引用,所以我创建了
exit()
并传递了对它的引用:

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

我无法在win7 64位Python 26中重现该问题。如果我关闭qt框架,控制台会再次显示正常提示,我可以在上面输入文本。我应该提到我在Linux上运行这个框架(我会编辑以提及这一点)。不同平台之间的终端行为可能有很大差异。不过谢谢你的检查!我发现
reset
tput reset
都不可靠。太棒了!
stty sane
命令实际上是在不清除终端本身的情况下使终端脱离原始模式,这是使用
reset
命令时发生的情况。谢谢这个答案应该被接受。确实解决了问题。可以确认这是有效的。对于新手:您必须在Python解释器中执行此操作,然后
import os
first;)要粘贴到破损终端中的一个衬垫是
import os;system('stty sane')
有没有一种方法可以在本机python中做到这一点,而不必剥落?+1当我的MacOS终端进入一种奇怪的“noecho”状态时,这也适用于我。我只需键入
sttysane
(虽然我看不到),一切都很好。使用诅咒,查看方法。它设置一些最常见的诅咒设置,并在代码结束时取消设置,即使程序被异常终止。