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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:45:35