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

Mac系统中Python调用keyboard模块记录按键为何返回None而非键名

解决macOS下Python记录按键时写入None的问题

问题原因

在macOS环境下出现这个问题,核心原因有两点:

  • 系统安全权限限制:macOS对键盘监听类操作有严格的隐私管控,即便通过sudo提升进程权限,也需要手动在系统设置中授予应用对应权限。
  • keyboard模块兼容性问题:该模块在macOS上对部分按键的event.name属性支持不完善,导致无法正确获取按键名称,返回None。

解决方案

1. 配置系统隐私权限

这是最关键的前置步骤:

  • 打开「系统设置」→「隐私与安全性」
  • 在左侧列表找到「输入监控」,勾选你运行代码的终端(如Terminal、iTerm)或IDE(如VSCode)
  • 同样在「辅助功能」列表中,勾选对应的应用
  • 重启终端/IDE后,再尝试运行代码(可配合sudo)

2. 修改keyboard模块代码逻辑

若权限配置后仍有None输出,可尝试获取事件的其他属性作为替代:

import keyboard

log_file = 'keystrokes.txt'

def on_key_press(event):
    # 优先使用按键名称,无则用扫描码作为标识
    key_content = event.name or f"scan_code:{event.scan_code}"
    with open(log_file, 'a') as f:
        f.write(f'{key_content}\n')

keyboard.on_press(on_key_press)
keyboard.wait()

3. 更换为兼容性更好的pynput模块

pynput在macOS上的键盘监听支持更稳定,示例代码如下:

from pynput.keyboard import Listener

log_file = 'keystrokes.txt'

def on_key_press(key):
    try:
        # 捕获普通字符按键
        key_str = key.char
    except AttributeError:
        # 处理特殊按键(如空格、回车、删除等),简化输出格式
        key_str = str(key).replace("Key.", "")
    with open(log_file, 'a') as f:
        f.write(f'{key_str}\n')

# 启动监听,直到手动终止进程
with Listener(on_press=on_key_press) as listener:
    listener.join()

使用pynput时仍需完成步骤1的权限配置,运行时可添加sudo确保权限充足。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:42:55