WSL2中导入apa102_pi模块报错,寻求虚拟SPI端口或导入兼容方案
问题描述
我正在使用一款基于Raspberry Pi SPI引脚通信的APA102灯带Python模块。由于无法随时携带树莓派,在本地WSL2环境中执行脚本时,导入apa102_pi模块出现异常,报错信息如下:
WARNING: GENERIC_X86 is not fully supported. Some features may not work. WARNING: GENERIC_X86 is not fully supported. Some features may not work. Traceback (most recent call last): File "/home/michael/.pyenv/versions/apa_env/bin/apa102_server", line 33, in <module> sys.exit(load_entry_point('michaelstuffer98.apa102-tcp-server==0.0.0', 'console_scripts', 'apa102_server')()) File "/home/michael/.pyenv/versions/apa_env/bin/apa102_server", line 25, in importlib_load_entry_point return next(matches).load() File "/home/michael/.pyenv/versions/3.9.15/lib/python3.9/importlib/metadata.py", line 86, in load module = import_module(match.group('module')) File "/home/michael/.pyenv/versions/3.9.15/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/home/michael/.pyenv/versions/3.9.15/envs/apa_env/lib/python3.9/site-packages/apa102_tcp_server/led_audio_controller.py", line 3, in <module> from apa102_tcp_server.apa_led import LedStrip File "/home/michael/.pyenv/versions/3.9.15/envs/apa_env/lib/python3.9/site-packages/apa102_tcp_server/apa_led.py", line 1, in <module> from apa102_pi.driver import apa102 File "/home/michael/.pyenv/versions/3.9.15/envs/apa_env/lib/python3.9/site-packages/apa102_pi/driver/apa102.py", line 10, in <module> from microcontroller.pin import spiPorts ImportError: cannot import name 'spiPorts' from 'microcontroller.pin' (/home/michael/.pyenv/versions/3.9.15/envs/apa_env/lib/python3.9/site-packages/microcontroller/pin.py)
核心问题是WSL2环境无可用串行引脚,希望实现兼容方案(比如伪终端或虚拟SPI),不需要模块实际功能,只要能正常导入即可。
解决方案
方法1:Mock缺失的spiPorts对象
通过Python内置的unittest.mock模块在导入前替换缺失的依赖,无需修改原有模块文件:
- 在你的脚本开头添加以下代码:
from unittest.mock import Mock, patch import sys # 创建mock的spiPorts对象,模拟空列表即可满足导入要求 mock_spi_ports = Mock() mock_spi_ports.return_value = [] # 替换microcontroller.pin中的spiPorts with patch('microcontroller.pin.spiPorts', mock_spi_ports): # 在此处导入目标模块 from apa102_pi.driver import apa102 # 后续业务代码正常执行
如果是通过入口脚本(如apa102_server)启动,直接修改该入口脚本的开头,加入上述mock逻辑即可。
方法2:直接修改microcontroller.pin模块文件
在已安装的依赖模块中添加缺失的spiPorts定义:
- 找到报错显示的
pin.py路径:/home/michael/.pyenv/versions/3.9.15/envs/apa_env/lib/python3.9/site-packages/microcontroller/pin.py - 编辑该文件,在任意合适位置添加一行:
spiPorts = []
保存后重新运行脚本,模块即可正常导入。
方法3:创建虚拟SPI设备(可选,如需基础功能)
如果希望模块能具备基础的SPI模拟能力,可在WSL2中创建虚拟SPI设备:
- 加载虚拟SPI内核模块(需WSL2启用systemd,或手动执行命令):
sudo modprobe spi-dev sudo mknod /dev/spidev0.0 c 153 0 sudo chmod 666 /dev/spidev0.0
- 安装
spidev依赖模块:
pip install spidev
注:该方法可能无法完全适配apa102_pi对树莓派SPI的特定依赖,但能解决硬件检测类的导入问题。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

