Linux下Python的libgpiod与gpiod包差异及Ubuntu使用指南
Python中libgpiod与gpiod包的区别及Ubuntu下GPIO操控指南
两个包的核心区别
- libgpiod:官方出品的Python绑定,对应C语言的libgpiod库,API采用面向对象风格(如
Chip类),在NixOS、MacOS等系统的包管理器中以libgpiod-python类名称提供,功能和官方libgpiod项目同步,稳定性更强。 - gpiod:第三方社区维护的Python包,API采用小写风格(如
gpiod.chip函数),实现逻辑和官方绑定有差异,Ubuntu的apt仓库及PyPI上仅提供该包,适配Ubuntu生态但文档相对零散。
Ubuntu下gpiod包的问题解决及正确用法
错误22(EINVAL)的原因及解决
你遇到的错误22是参数无效,核心原因是传入get_line的是全局GPIO编号,而非对应芯片内的引脚偏移量。Intel Up Xtreme i11的全局GPIO编号和芯片内的偏移量并非直接对应,需先确认目标引脚所属的芯片及偏移:
- 执行以下命令查看系统中的GPIO芯片:
输出类似:gpiodetectgpiochip0 [INT34C3:00] (32 lines) gpiochip1 [INT34C2:00] (24 lines) - 查看目标芯片的引脚详情,以gpiochip0为例:
找到你要控制的引脚(可通过引脚名称或硬件标识匹配),记录第一列的偏移量(如gpioinfo gpiochip0line 25: "GPIO9" ...,这里的25就是芯片内的偏移量,而非全局的9)。
修正后的测试代码
将引脚号替换为芯片内的偏移量,同时适配gpiod的API细节:
import gpiod import time # 替换为你从gpioinfo中查到的芯片内引脚偏移量 POWER_OFFSET = 25 def main(): # 打开GPIO芯片 chip = gpiod.chip('gpiochip0') # 获取目标引脚 power_line = chip.get_line(POWER_OFFSET) # 请求输出方向 req = gpiod.line_request() req.consumer = "motor_movement" req.request_type = gpiod.line_request.DIRECTION_OUTPUT power_line.request(req) delay = 1.0 try: while True: power_line.set_value(1) time.sleep(delay) power_line.set_value(0) time.sleep(delay) finally: power_line.release() if __name__ == "__main__": main()
额外注意事项
- 必须以root权限运行程序,否则会出现权限不足错误
- 若仍报错,可检查目标引脚是否被其他设备占用(
gpioinfo输出中used列会显示"yes") - Ubuntu的gpiod包版本可能因发行版不同略有差异,若遇到API不兼容,可通过
pip3 install gpiod --upgrade更新到最新版本
内容的提问来源于stack exchange,提问作者Joymaker
相关产品推荐
相关产品推荐

