输入()/ raw_input()期间exit()之后处于中断状态的终端(不可见文本/无回显)

Sho*_*Sho 17 python terminal pyqt pyqt4 python-3.x

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

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

我已经尝试了各种方法来解决这个问题,从使用curses模块和其他方法在运行之前重置终端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()
Run Code Online (Sandbox Code Playgroud)

对于那些不熟悉(PY)的Qt,这将打开一个空白窗口,当它是封闭的,从连接applastWindowClosed信号将导致内置通话exit()功能的情况发生.当code模块执行input()要读取的调用时会发生这种情况sys.stdin.在这里,当我关闭窗口时,之后输入终端并不会显示任何类型的字符.

我主要使用Python 3,实际的应用程序使用Python 3特定的代码,但我也尝试过Python 2.7中的测试用例,它也显示了同样的问题.

Que*_*les 20

试试os.system('stty sane').本stty sane应该重置回声,显然一些其他的东西.


小智 19

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

在开发没有正确关闭管道的交流应用程序时,我遇到过类似的问题.也许类似的事情也在这里发生.