树莓派4(4GB)Ubuntu 20.10系统下RPi.GPIO库报错“Not running on a RPi!”的问题排查
解决RPi.GPIO在Ubuntu 20.10树莓派上的"Not running on a RPi!"错误
你遇到的问题确实和RPi.GPIO与Ubuntu系统的兼容性有关——RPi.GPIO库最初是为Raspberry Pi OS(原Raspbian)开发的,它依赖Raspberry Pi OS特有的硬件检测机制和底层GPIO配置,在Ubuntu这类通用Linux发行版上会因为检测不到树莓派硬件标识而抛出这个错误。
为什么会出现这个错误?
RPi.GPIO启动时会检查/proc/cpuinfo中的硬件型号、/sys/class/gpio的布局等树莓派专属标识,而Ubuntu 20.10 for Raspberry Pi的系统配置和Raspberry Pi OS存在差异,导致库无法确认当前运行在树莓派设备上,从而触发RuntimeError。
推荐的解决方案:改用gpiod库
Ubuntu官方推荐使用libgpiod(Linux GPIO用户空间库)来控制树莓派GPIO,它是通用Linux发行版的标准GPIO工具,兼容性更好。以下是迁移你的关机按钮代码到gpiod的步骤:
- 安装
gpiod库和Python绑定:
sudo apt update && sudo apt install -y gpiod python3-gpiod
(注意:Ubuntu 20.10的Python 2.7已停止维护,建议切换到Python 3)
- 改写你的代码为
gpiod版本:
#!/usr/bin/env python3 import gpiod import subprocess from time import sleep # 定义GPIO芯片和引脚(BCM 12对应物理引脚32,树莓派的GPIO芯片通常为gpiochip0) CHIP = gpiod.Chip('gpiochip0') INT_LINE = CHIP.get_line(12) # 配置引脚为输入,启用上拉电阻 line_config = gpiod.line_request() line_config.request_type = gpiod.line_request.DIRECTION_INPUT line_config.flags = gpiod.line_request.FLAG_BIAS_PULL_UP INT_LINE.request(line_config) def main(): while True: # 等待引脚电平下降(按钮按下),超时设为None表示一直等待 INT_LINE.event_wait(None) # 清除事件标志 INT_LINE.event_read() # 等待3秒确认是长按操作 sleep(3) # 检查引脚电平是否仍为低(按钮保持按下状态) if INT_LINE.get_value() == 0: # 执行关机命令 subprocess.call(['poweroff'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if __name__ == '__main__': try: main() finally: # 程序退出时释放引脚和芯片资源 INT_LINE.release() CHIP.close()
其他可选方案(不推荐)
如果你坚持要使用RPi.GPIO,可以尝试以下方法,但稳定性无法保证:
- 手动修改RPi.GPIO的硬件检测逻辑:找到库的安装路径(比如
/usr/lib/python2.7/dist-packages/RPi/GPIO),编辑__init__.py文件跳过硬件检测步骤,但这可能引发其他未知问题。 - 安装社区适配的RPi.GPIO分支:部分社区维护的分支针对Ubuntu做了适配,但需要自行查找并编译安装。
总的来说,迁移到gpiod是更可靠、更符合Ubuntu生态的选择,也能避免后续版本更新带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Juanma
相关产品推荐
相关产品推荐

