在没有 root 权限的 Python 中使用 /sys/class/gpio/

Ora*_*Tux 5 linux permissions acl

我想使用 Python 模块Ablib与 GPIO 引脚进行交互。我想在没有 root 权限的情况下执行此操作。我怎样才能做到这一点?

当我创建一个ablib.Pin实例时,模块会打开/sys/class/gpio/export并将引脚编号写入其中。最初这会引发 IOErro:

IOError: [Errno 13] Permission denied: '/sys/class/gpio/export'
Run Code Online (Sandbox Code Playgroud)

这可以通过 轻松解决chmod。现在,当我创建一个ablib.Pin实例时,我在另一个文件上收到了 IOError:

IOError: [Errno 13] Permission denied: '/sys/class/gpio/pioC16/direction'
Run Code Online (Sandbox Code Playgroud)

ls -la关于/sys/class/gpio退货:

--w-------  1 my_user my_user 4096 Jan  1 01:42 export
lrwxrwxrwx  1 root root    0 Jan  1 01:42 pioC16 -> ../../devices/ahb.0/apb.1/pinctrl.2/fffff800.gpio/gpio/pioC16
Run Code Online (Sandbox Code Playgroud)

写入 115 时/sys/class/gpio/export,内核会创建符号链接/sys/class/pioC16。问题root是这个链接的所有者。我希望新创建的文件归my_user. 但我不知道如何做到这一点。我试过chmod并且chown

$ chown -R my_user:my_user /sys/class/gpio
$ chmod g+s /sys/class/gpio
Run Code Online (Sandbox Code Playgroud)

我试过了ACL。但是根据这个问题,看起来我不能在sysfs.

$ setfacl -m group:my_group:rwx /sys/class/gpio
setfacl: /sys/class/gpio: Invalid argument
Run Code Online (Sandbox Code Playgroud)

有人知道如何解决这个问题吗?

Cer*_*rin 3

这已在这里得到解答。

本质上,编辑文件/etc/udev/rules.d/99-com.rules并附加:

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio'"
Run Code Online (Sandbox Code Playgroud)

然后将您的用户添加到“gpio”组:

sudo usermod -a -G gpio <youruser>
Run Code Online (Sandbox Code Playgroud)

重新启动后,您应该能够以普通用户身份读取和写入 /sys/class/gpio。我自己就是这样做的,效果很好。