Python基于pynput的键盘监听代码无法写入按键到文件问题排查
问题排查与修复方案
核心问题梳理
- 变量名大小写不匹配:全局变量定义为
Keys,但函数内声明的全局变量是keys,二者属于不同变量,无法正常存储捕获到的按键 - 函数定义位置错误:
write_file写在了on_press的if分支内部,且缩进错误,外部无法调用该函数 on_press函数重复定义:后半段又定义了一次只有打印逻辑的on_press,覆盖了前面带写入逻辑的实现,实际运行时不会触发文件写入操作- 字符串替换语法错误:
str(key).replace("'" ",")缺少参数分隔逗号,属于语法错误,执行会直接报错 - 代码块缩进混乱:Python依赖缩进识别代码层级,原代码大量缩进错误导致逻辑分支无法正常执行
修复后完整可运行代码
import pynput from pynput.keyboard import Key, Listener count = 0 keys = [] def write_file(keys): with open("logs.txt", "a", encoding="utf-8") as f: for key in keys: k = str(key).replace("'", "") if k.find("space") > 0: f.write('\n') elif k.find("Key") == -1: f.write(k) def on_press(key): global keys, count keys.append(key) count += 1 print("{0} pressed".format(key)) if count >= 5: count = 0 write_file(keys) keys = [] def on_release(key): if key == Key.esc: # 退出前写入剩余未存的按键,避免数据丢失 if keys: write_file(keys) return False with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
额外优化说明
- 统一变量名大小写,保证全局变量引用正确
- 将
write_file移到全局作用域,调整为正确缩进 - 删除重复定义的无效
on_press函数,保留完整写入逻辑 - 修复字符串替换语法错误,实现去除按键字符串前后多余单引号
- 新增退出前写入剩余按键逻辑,避免最后不足5个按键的内容丢失
- 打开文件时指定
utf-8编码,避免不同系统下编码兼容报错
内容的提问来源于stack exchange,提问作者GIGI
相关产品推荐
相关产品推荐

