Python pynput按键记录程序新增启动确认提示报语法错误排查
问题原因
- 触发语法错误的直接原因是
if/elif/else结构被打断:三个分支必须保持同一缩进层级、同属一个代码块,原代码把按键监听逻辑、函数定义直接插在了if分支和elif分支中间,导致elif找不到对应的同级if,代码解析直接失败。 - 逻辑顺序颠倒:按键监听的代码写在了询问逻辑的外层、
yes_or_no()函数调用之前,程序运行会先启动监听,根本不会执行用户询问步骤。 - 函数定义位置错误:
on_press回调函数被错误放在了if分支的缩进层级内,不属于全局作用域,后续监听调用时也会触发异常。
修复后完整代码
from pynput.keyboard import Key, Listener import logging import sys # 按键按下时的日志记录回调 def on_press(key): logging.info(str(key)) # 用户执行确认逻辑 def yes_or_no(): inp = input("是否要记录所有按键输入 Y/N?").strip().upper() if inp == "Y": print("程序启动中") # 初始化日志配置 logging.basicConfig(filename=("keylog.txt"), level=logging.DEBUG, format=" %(asctime)s - %(message)s") # 启动按键监听 with Listener(on_press=on_press) as listener: listener.join() elif inp == "N": print("程序退出") sys.exit() else: print("请输入Y或者N进行选择") yes_or_no() if __name__ == "__main__": yes_or_no()
关键调整说明
- 统一
if/elif/else缩进层级,全部放在yes_or_no()函数内部,从根源解决语法错误。 - 把日志初始化、按键监听启动的逻辑全部移动到用户输入
Y的分支下,只有用户明确确认后才会启动按键记录。 - 将
on_press回调函数移动到全局作用域,保证监听时可以正常调用。 - 对用户输入增加去空格、转大写处理,支持小写y/n、输入前后带空格的场景,避免用户输入格式问题导致逻辑判断失败。
- 增加脚本入口判断,避免脚本被作为模块导入时自动执行。
内容的提问来源于stack exchange,提问作者Jaycob Grigg
相关产品推荐
相关产品推荐

