我一直在使用 Python 3 编写一个小型实用程序应用程序(不过,下面的测试用例也适用于 Python 2)和 PyQt 4,它使用
code
模块生成 REPL 提示符,允许与 Qt 窗口交互。
不幸的是,我遇到了一个无法解决的问题:当我
exit()
应用程序而code
位于input()
(在Python 2.x中称为raw_input()
)时,我的Linux终端随后没有较长的回显键入的字符。 IE。终端似乎处于损坏状态,可能是由于 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 的人,这将打开一个空白窗口,当它关闭时,来自
app
的 lastWindowClosed
信号的连接将导致对内置 exit()
函数的调用。当 code
模块执行对 input()
的调用以从 sys.stdin
读取时,会发生这种情况。在这里,当我关闭窗口时,随后在终端中输入不会显示任何类型的字符。
我主要使用Python 3,实际应用程序使用Python 3特定的代码,但我也尝试过Python 2.7中的测试用例,它显示了同样的问题。
尝试
os.system('stty sane')
。 stty sane
应该重置回声,显然还有其他一些东西。
这并不能真正解决问题,但是 如果您关闭应用程序后在终端中输入“重置”,它将恢复正常。
在开发未正确关闭管道的 C 应用程序时,我曾经遇到过类似的问题。 也许类似的事情也在这里发生。
Quentin Engles 的答案也对我有用,但作为一个 Python 新手,我不明白 stty sane
应该去哪里。经过一番摸索和摸索之后,我发现 exit 是对
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()
import os
回避了问题,然后用
os.system('reset')
结束程序。