在 input() / raw_input() 期间 exit() 后终端处于损坏状态(不可见文本/无回显)

问题描述 投票:0回答:5

我一直在使用 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中的测试用例,它显示了同样的问题。

python terminal python-3.x pyqt pyqt4
5个回答
34
投票

尝试

os.system('stty sane')
stty sane
应该重置回声,显然还有其他一些东西。


21
投票

这并不能真正解决问题,但是 如果您关闭应用程序后在终端中输入“重置”,它将恢复正常。

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


3
投票

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()
    

0
投票
我在使用curses模块时遇到了同样的问题。使用本页上的其他答案,我在程序开始时用

import os

 回避了问题,然后用 
os.system('reset')
 结束程序。


0
投票
with

在程序退出之前做一些事情

import subprocess import atexit def exit_handler(): # fix terminal subprocess.call(["stty", "sane"]) atexit.register(exit_handler)
    
© www.soinside.com 2019 - 2024. All rights reserved.