无需sudo权限:实现Python无限while循环的按键响应
无阻塞捕获按键的无限循环实现(Linux环境)
在Linux下无需sudo权限的方案,可以通过修改终端属性结合select模块实现无阻塞按键捕获,不用依赖第三方库。核心思路是把终端从默认的规范模式(需要回车才提交输入)改成非规范模式,同时用select检查输入缓冲区是否有数据,避免阻塞主循环任务。
完整实现代码
import sys import select import termios import tty def main(): # 保存终端原始属性,用于程序结束后恢复 original_attr = termios.tcgetattr(sys.stdin) try: # 设置终端为非规范模式,关闭回显 tty.setcbreak(sys.stdin.fileno()) n = 1 while True: # 主任务逻辑:持续执行的操作 print(f"正在执行主任务,计数:{n}", end="\r") n += 1 # 检查stdin是否有输入(超时0秒,非阻塞) if select.select([sys.stdin], [], [], 0)[0]: # 读取一个按键 key = sys.stdin.read(1) # 判断按键执行对应操作 if key.lower() == 'p': print("\n触发任务1:执行特定操作") elif key.lower() == 'f': print("\n收到退出指令,终止循环") break # 可添加更多按键判断 # elif key.lower() == 'x': # print("\n触发任务2") finally: # 无论程序如何退出,都恢复终端原始属性 termios.tcsetattr(sys.stdin, termios.TCSADRAIN, original_attr) print("\n终端已恢复正常") if __name__ == "__main__": main()
关键部分说明
- 终端模式修改:
tty.setcbreak让终端进入非规范模式,按键输入直接传递给程序,无需回车;同时关闭回显,避免按键在终端上显示。 - 非阻塞检查:
select.select([sys.stdin], [], [], 0)会立即返回,第一个列表不为空说明有按键输入,不会阻塞主任务的执行。 - 终端恢复:
finally块里用termios.tcsetattr恢复终端原始属性,防止程序异常退出后终端无法正常输入。
注意事项
- 该方案仅适用于Linux/Unix类系统,Windows环境需要用其他方法(比如
msvcrt模块)。 - 按键区分大小写,代码里用
key.lower()统一转成小写,也可以根据需求改成区分大小写。
内容的提问来源于stack exchange,提问作者JACK
相关产品推荐
相关产品推荐

