我正在编写一个将在Raspberry上运行的Python脚本,该脚本将从传感器读取温度并记录到Thingspeak。我有一个使用bash脚本,但不想用Python做,因为它更容易操作和检查读取值。传感器读数由名为loldht的库完成。我试图这样做:
from subprocess import STDOUT, check_output
output = check_output("/home/pi/bin/lol_dht22/loldht", timeout=10)
问题是我必须使用sudo运行库才能访问引脚。我将脚本作为cron运行。是否可以使用sudo运行它?
或者我可以创建一个执行' sudo loldht'的bash脚本。然后从python运行bash脚本?
答案 0 :(得分:4)
我将脚本作为cron运行。是否可以使用sudo运行它?
您可以将python script.py
放入具有足够权限的用户的cron中(例如root或具有相关文件和设备权限的用户)
我不知道你正在使用哪个操作系统,但如果Raspbian接近Debian,则不需要sudo或root,只需使用具有足够权限的用户。
我似乎也可以这样做
check_output check_output(["sudo", "/home/pi/bin/lol_dht22/loldht", "7"], timeout=10)
当然,但是要调用该Python脚本的unix用户需要sudo权限(否则无法从sudo
调用subprocess
)。在这种情况下,您可以执行上述操作,从具有所需权限的用户运行cron。
答案 1 :(得分:2)
您可以使用cron运行sudo命令。只需使用sudo crontab -e来设置cron,它应该可以正常工作。
答案 2 :(得分:1)
你应该非常谨慎地运行root
。由于root
可以访问所有内容,因此一个简单的错误可能会导致系统无法使用。
以普通用户身份访问硬件的正确方法是更改所需设备文件的权限。
您提到的实用程序似乎使用WiringPi库。有些人在source code中进行了挖掘,表示它使用的是/dev/gpiomem
(或/dev/mem
)设备。
在raspbian上,设备权限设置为udev
。请参阅here和here。
您可以通过创建文件,例如每个用户授予/dev/gpiomem
和其他gpio设备的访问权限。 /etc/udev/rules.d/local.rules
并在其中加入以下文字:
ACTION=="add", KERNEL=="gpio*", MODE="0666"
ACTION=="add", KERNEL=="i2c-[0-9]*", MODE="0666"
第一行使gpio设备可用,第二行使用I2C设备。