MacOS 15.1.1下pynput键盘监听器权限不足问题求助
问题描述
我正在为大学作业运行这段代码,但一直解决不了监听器的权限问题。我已经试过下载PyCharm,把PyCharm、VSCode和终端都添加到了系统的辅助功能设置里,也尝试过以root权限运行,但都没用。有没有人遇到过同样的问题?
我的系统是:MacOS 15.1.1 (24B91)
相关代码
import pynput import time def _flush_input(): try: import msvcrt while msvcrt.kbhit(): msvcrt.getch() except ImportError: import sys, termios termios.tcflush(sys.stdin, termios.TCIOFLUSH) def get_pressed_keys(keys_filter=None): """ Returns a list of all pressed keys at the time of the call. Parameters: keys_filter (list[str]): A list of specific keys to check. If omitted, every key is checked. Returns: list[str]: A list of currently pressed keys. """ keys_lst = [] def on_press(key): try: if key.char not in keys_lst: keys_lst.append(key.char) except AttributeError: if key not in keys_lst: keys_lst.append(str(key)) # Initialize the listener listener = pynput.keyboard.Listener(on_press=on_press) # Check if listener has the IS_TRUSTED attribute and if it's True if hasattr(listener, 'IS_TRUSTED') and listener.IS_TRUSTED: print("Listener is trusted and has the necessary permissions!") else: print("Listener does not have the necessary permissions.") return [] # Start the listener to capture key presses listener.start() time.sleep(0.5) # Give it time to register key presses listener.stop() # Flush any leftover input _flush_input() # Return the filtered keys (if any filter is passed) if keys_filter is None: return keys_lst else: return [k for k in keys_filter if k in keys_lst] def clear_print(*args, **kwargs): """ Clears the terminal before calling print() """ print("\033[H\033[J", end="") print(*args, **kwargs)
可能的解决思路
我之前帮朋友排查过MacOS下pynput的权限问题,给你几个可以尝试的方向:
彻底重启相关应用和系统
有时候添加权限后,应用没有真正读取到更新的设置,完全退出PyCharm/VSCode/终端,甚至重启电脑再试,这个小细节经常被忽略但很有效。检查权限的完整性
去系统设置 > 隐私与安全性,除了辅助功能,还要检查输入监控权限——MacOS 10.14+之后,监听键盘输入同时需要这两个权限,把你的开发工具和终端都加进去并勾选。另外要确认添加的是你正在使用的应用版本(比如PyCharm如果是官网下载的,和App Store版本路径不同,要对应上)。用终端直接运行脚本,绕过IDE
有时候IDE的权限继承有问题,你可以试试:打开终端,cd到脚本所在文件夹,用python3 your_script.py或者sudo python3 your_script.py运行(如果用sudo,要确保终端已经在权限列表里)。更新pynput到最新版本
旧版本的pynput可能对新的MacOS版本(比如15.1.1)支持不好,运行pip install --upgrade pynput更新到最新版,说不定权限检测逻辑已经修复了。临时关闭系统完整性保护(SIP)(最后手段)
这个不推荐日常使用,但如果作业紧急可以临时测试:重启电脑按住Command+R进入恢复模式,打开终端输入csrutil disable,重启后再运行脚本,测试完记得再打开SIP(同样进入恢复模式执行csrutil enable)。
备注:内容来源于stack exchange,提问作者amit omer

