Octopi树莓派控制LED时sudo运行脚本出现ModuleNotFoundError: No module named 'board'问题求助
问题根源与解决方案
首先,咱们来拆解你遇到的两个核心问题:
1. 为什么sudo运行脚本时找不到board模块?
你在普通用户的虚拟环境(venv)里安装了board等依赖,但sudo默认会使用root用户的全局Python环境,而不是你当前激活的那个venv。虚拟环境是用户隔离的——root的环境里根本没装这些模块,所以自然会报ModuleNotFoundError。
2. 解决办法(按推荐程度排序)
方法一:用虚拟环境的Python路径直接运行(最推荐)
不用激活venv,直接指定venv里的Python解释器路径给sudo,这样既用了有依赖的环境,又获得了权限:
sudo ./venv/bin/python leds/led_controller.py
(如果你的venv不在当前目录,把路径换成实际的即可,比如/home/pi/my_venv/bin/python)
方法二:让普通用户拥有GPIO访问权限,不用sudo
这个方法更优雅,避免每次都用sudo。报错Can't open /dev/mem: Permission denied是因为普通用户没有访问GPIO设备的权限,把你的用户加入gpio组就行:
sudo usermod -aG gpio $USER
执行完后,注销再重新登录(或者重启树莓派),之后直接用虚拟环境的Python运行脚本就可以了:
./venv/bin/python leds/led_controller.py
方法三:给root安装依赖(不推荐,仅应急)
这个方法会污染root的全局Python环境,尽量不用,但如果临时需要:
sudo pip install board adafruit-blinka
(假设你用的是Adafruit的board库,通常需要搭配adafruit-blinka才能在树莓派上正常工作)
额外小提示:关于GPIO 17的错误
你之前遇到“Gpio 17 is illegal”,大概率是因为你用的LED控制库(比如Adafruit Blinka)对引脚的命名规范有要求,或者该引脚被OctoPrint系统服务、其他程序占用了。换成GPIO 18能正常运行就没问题,如果之后想复用17,可以用gpio readall命令查看引脚的占用状态。
内容的提问来源于stack exchange,提问作者ffonz




