MacOS运行Python蓝牙代码报lightblue无finddevices属性错误
问题原因
这个报错和代码逻辑无关,核心是依赖安装错误:
- 你通过
pip install python-lightblue装到的是PyPI上的同名占位无效包,根本不是PyBluez(即你导入的bluetooth模块)在macOS下需要的底层lightblue框架,这个包内不存在finddevices接口。 - 原生lightblue框架是Python2时代的遗留项目,官方从未发布适配Python3的PyPI安装包;且macOS 12(Monterey)及以上版本已经废弃了PyBluez依赖的老式系统蓝牙API,就算强行装上老版本lightblue,大概率也会出现扫描不到设备、权限报错等问题。
解决方法
推荐方案:换用macOS原生兼容的蓝牙库(适配所有新版macOS+Python3)
这是目前成本最低、稳定性最高的方案,不需要折腾停止维护的老旧依赖:
- 第一步先清理错误安装的包:
pip uninstall -y pybluez python-lightblue lightblue
- 第二步安装
bleak,这是目前维护最活跃的跨平台Python蓝牙库,在macOS上直接调用系统原生蓝牙框架,不需要额外安装编译依赖:
pip install bleak
- 第三步替换原有扫描代码,参考示例:
import asyncio from bleak import BleakScanner async def main(): # 扫描时长8秒,和原代码duration参数对应 nearby_devices = await BleakScanner.discover(timeout=8) for dev in nearby_devices: print(f"设备标识:{dev.address},设备名称:{dev.name},信号强度:{dev.rssi}dBm") return nearby_devices if __name__ == "__main__": device_list = asyncio.run(main())
注意:第一次运行代码时系统会弹出蓝牙权限申请,必须给运行代码的终端/IDE开启蓝牙权限,设置路径为「系统设置-隐私与安全性-蓝牙」,未开权限会直接返回空的设备列表。
不推荐方案:硬适配原有PyBluez代码(仅支持macOS 11及以下老系统)
如果一定要保留原有PyBluez代码逻辑,不要通过pip安装lightblue:
- 先安装Xcode编译依赖:执行命令
xcode-select --install - 卸载所有已安装的lightblue相关pip包
- 本地编译安装社区维护的适配Python3的lightblue分支,安装完成后原代码即可运行。该方案在新macOS系统上兼容性极差,不建议花费时间折腾。
内容的提问来源于stack exchange,提问作者Pixzium Media
相关产品推荐
相关产品推荐

