You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:02:08