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
相关产品推荐
相关产品推荐

