我已经使用RPi.GPIO库制作了一个python脚本。我需要在没有root用户的情况下运行它,但是在使用“ python ./script.py”运行它时出现此错误:

No access to /dev/mem. Try running as root!


我在很多地方都读到了您不再需要使用该库的最新版本的root用户,但更新后仍然出现错误。我的版本是RPi.GPIO 0.6.0a3

这是代码:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)


和完整的错误:

pi@raspberrypi ~/Desktop/python $ python ./sensors.py
Traceback (most recent call last):
  File "./sensors.py", line 5, in <module>
    GPIO.setup(18,GPIO.OUT)
RuntimeError: No access to /dev/mem.  Try running as root!


当我以root身份运行时,它可以工作。

评论

sudo adduser my_new_user gpio是正确的,但请记住注销并重新登录,因为更新组成员身份需要重新登录才能生效。

#1 楼

您可能需要运行Raspbian才能以非root用户身份使用RPi.GPIO,也可能需要是jessie。

是否存在/dev/gpiomem?如果是这样,RPi.GPIO应该使用该设备访问GPIO。如果/dev/gpiomem不存在,请尝试:

sudo rpi-update


,以确保您使用的是最新内核,并且

sudo apt-get update
sudo apt-get upgrade


,以确保您使用的是最新的RPi.GPIO。

,您还需要确保自己是gpio组的成员:

sudo adduser pi gpio


编辑后添加

Raspbian系统似乎处于不断变化的状态。我不确定是Raspbian还是(更可能是raspberrypi.org)问题。

检查/ dev / gpiomem是否具有正确的权限。

$ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 244, 0 Dec 28 22:51 /dev/gpiomem


如果没有,请按照以下步骤设置正确的权限

sudo chown root.gpio /dev/gpiomem
sudo chmod g+rw /dev/gpiomem


评论


还是行不通。一切已更新,/ dev / gpiomem存在,当我尝试将用户添加到gpio组时,它说它已经是成员

–JoeyCK
15/12/28在0:06



@JoeyCK:请注意,更改组成员身份不会影响已经在运行的进程。运行id列出外壳程序的当前组,如果未列出gpio,请再次登录或重新启动。

– deltab
2015年12月28日,下午3:57

@JoeyCK RPi.GPIO报告什么版本?

–琼
15年12月28日在9:00

@joan版本0.5.11

–JoeyCK
15年12月28日在14:22

Pi总是会更好地支持@mjwittering Raspbian。如果您喜欢Ubuntu,则需要在每次启动时应用更改。您可以使用crontab中的启动脚本或重新启动项自动执行此操作。

–琼
16 Mar 24 '16 at 10:25

#2 楼

我立即遇到了这个问题,并通过以下方法解决了这个问题:

sudo adduser my_new_user gpio


这样,用户“ my_new_user”被添加到了gpio组中,因此, gpio组可以访问GPIO引脚。

评论


您的意思是/ dev / gpiomem(不是/ dev / mem)。

–琼
16年6月7日在20:44

实际上,如果您都查看/ dev,则会发现两个设备都存在,并且问题主题是关于/ dev / mem

–ИванАндреевичЧерногоров
16年6月7日在21:51

否。gpio组的成员无权访问/ dev / mem。

–琼
16年6月7日在21:53

是的,kmem的成员确实如此,所以解决方案很简单

–ИванАндреевичЧерногоров
16年6月8日在14:53

好的,但关键是要提供对GPIO的安全,无根访问。将用户添加到kmem组是不安全的,并且不会授予对GPIO的访问权限。

–琼
16年6月8日在15:36

#3 楼

我可以回答这个问题。

sudo chown root.gpio /dev/mem


这会将/dev/mem的所有者和组分别更改为rootgpio

sudo chmod g+rw /dev/mem


然后授予组对此/dev/mem对象的读写权限。

/dev/mem对象基本上是系统上的整个内存空间。这意味着现在组gpio和其中的每个人都可以读写存储空间。

现在,存储空间中有很多东西,包括CPU寄存器。当您切换GPIO引脚时,您正在其中一个寄存器中更改一位。更重要的是,您需要确保正确执行操作,否则系统可能会发生严重不良事件。

为了帮助保护整个内存空间,仅将需要使用GPIO位工作的内存部分映射的电源映射到/dev/gpiomem。这实际上屏蔽/屏蔽了其余存储空间,防止其被访问,并且仅允许访问GPIO位。这允许访问GPIO存储器地址,并禁止该存储器的任何其他部分,例如当前任何其他程序正在使用的存储器。

实际上,这在安全性和系统稳定性保护方面都造成了漏洞允许访问GPIO内容以及内存的其余部分,但仅允许Pi组成员GPIO组中的用户使用。

以后,将使用诸如bcm2835之类的驱动程序库和wiringPi将进行更多更新(某些更新已经在进行中),并且基于这些工具构建的应用将得到进一步更新,然后在将来,希望所有这些GPIO麻烦不再存在。
< br直到您有两个选择,打开/dev/mem以对gpio进行读/写分组,或者以root用户身份运行,这对/dev/mem的所有对象都具有完全读权限。

希望如此。

当前仍然存在许多问题,您仍然需要以root身份运行。例如,使用依赖于node-red-contrib-dht-sensornode-dht-sensor模块,后者取决于BCM2835。它使用/dev/gpiomem进行段故障,因为它仍然在node-dht-sensor/dev/gpiomem中或它们的协同工作方式中存在一些错误。我不知道是哪种情况,但最终会解决。当BCM2835以“非根”身份运行并且存在/dev/gpiomem时,它将尝试使用/dev/gpiomem而不是/dev/mem,因此将/dev/mem打开到组gpio并没有帮助。 Bummer。

#4 楼

上面的答复均未包含所有步骤。我需要完成以下步骤,以非root用户访问GPIO引脚。我必须创建一个新组,将我的用户添加到该组中,然后更改权限(如前几篇文章所述)。


#5 楼

只需在终端中使用以下命令:

sudo chown root.gpio /dev/mem && sudo chmod g+rw /dev/mem


评论


您能否提供有关此命令的解释,以及为什么它与琼的答案不同? / dev / mem和/ dev / gpiomem有什么区别?

– Greenonline
16 Mar 20 '16 at 0:15

如果可以的话,最好使用Joan的答案,但是,如果无法将/ dev / mem更改为/ dev / gpiomem,将获得与/ dev / gpiomem相同的使用/ dev / mem的权限。

– Natim
18年8月2日在14:28

当更外科的方法解决了这个问题时,提供对所有/ dev / mem的访问是不安全的。

–布莱斯
18/12/18在1:53

#6 楼

如果要在geany中进行构建,则只需更改构建命令。

要编译的Java命令应为

sudo pi4j --compile "%f"


,execute命令应为是

sudo pi4j --run "%e"