You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编号和芯片内的偏移量并非直接对应,需先确认目标引脚所属的芯片及偏移:

  1. 执行以下命令查看系统中的GPIO芯片:
    gpiodetect
    
    输出类似:
    gpiochip0 [INT34C3:00] (32 lines)
    gpiochip1 [INT34C2:00] (24 lines)
    
  2. 查看目标芯片的引脚详情,以gpiochip0为例:
    gpioinfo gpiochip0
    
    找到你要控制的引脚(可通过引脚名称或硬件标识匹配),记录第一列的偏移量(如line 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:50:24