Linux环境下如何让Python退出终端raw模式并恢复input()使用?
如何在Python中恢复终端 Cooked 模式以正常使用input()?
问题的核心是:tty模块确实没有提供直接的setcooked()函数,但我们可以借助termios模块保存终端的原始属性,之后再恢复回去,就能让input()正常工作了。
解决步骤很简单,关键是在修改终端模式前先保存原始属性,具体代码如下:
import sys import tty import termios # 第一步:保存终端的原始属性 fd = sys.stdin.fileno() original_attrs = termios.tcgetattr(fd) try: # 进入cbreak模式(或者你需要的raw模式) tty.setcbreak(fd) # 这里执行你的特殊操作,比如读取鼠标、功能键等 print("现在处于cbreak模式,按任意键继续...") sys.stdin.read(1) finally: # 无论是否出错,都恢复终端原始属性,回到cooked模式 termios.tcsetattr(fd, termios.TCSADRAIN, original_attrs) # 现在input()可以正常使用了 user_input = input("请输入内容:") print(f"你输入的是:{user_input}")
为什么这样有效?
tty.setraw()和tty.setcbreak()本质上是调用termios模块修改了终端的控制属性。termios.tcgetattr(fd)会获取当前终端的全部属性配置,termios.tcsetattr(...)则把这些配置恢复回去,相当于回到了默认的cooked模式,这时input()的行缓冲、回显等功能就都正常了。
注意事项
- 一定要用
try-finally块包裹操作,避免程序中途出错导致终端属性无法恢复(比如终端失去回显、无法正常换行等)。 termios.TCSADRAIN参数表示等待所有输出都发送完毕后再修改属性,这是最安全的恢复时机。
内容的提问来源于stack exchange,提问作者user3603546
相关产品推荐
相关产品推荐

