如何使用pythonsubprocess.check_输出带根/sud

2024-10-06 11:52:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python脚本,它将在Raspberry上运行,它将从传感器读取温度并记录到Thingspeak。我用bash脚本来处理这个问题,但是不能用Python来实现,因为这样更容易操作和检查读取值。传感器读数是用一个名为loldht的库完成的。我试着这样做:

from subprocess import STDOUT, check_output
output = check_output("/home/pi/bin/lol_dht22/loldht", timeout=10)

问题是我必须用sudo运行库才能访问pin。我将以cron的身份运行脚本。可以用sudo运行这个吗?在

或者我可以创建一个执行“sudo loldht”的bash脚本,然后从python运行bash脚本吗?在


Tags: fromimport脚本bashoutputcheck记录sudo
3条回答

您应该非常小心地以root的形式运行。由于root可以访问所有内容,因此一个简单的错误就可能导致系统无法使用。在

作为普通用户访问硬件的正确方法是更改对所需设备文件的权限。在

您提到的实用程序似乎使用了WiringPi库。对source code的一些挖掘表明它使用/dev/gpiomem(或/dev/mem)设备。在

在raspbian上,使用udev设置设备权限。请参见here和{a4}。在

您可以通过创建一个文件,例如/etc/udev/rules.d/local.rules并将以下文本放入其中,从而为每个用户提供对/dev/gpiomem和其他gpio设备的访问权限:

ACTION=="add", KERNEL=="gpio*", MODE="0666"
ACTION=="add", KERNEL=="i2c-[0-9]*", MODE="0666"

第一行提供gpio设备,第二行提供I2C设备。在

I will run the script as a cron. Is it possible to run this with sudo?

您可以将python script.py放入具有足够权限的用户的cron中(例如root用户或对相关文件和设备具有权限的用户)

我不知道您使用的是哪个操作系统,但是如果Raspbian与Debian很接近,那么就不需要sudo或root,只需使用具有足够权限的用户。在

It seems I can also do this check_output check_output(["sudo", "/home/pi/bin/lol_dht22/loldht", "7"], timeout=10)

当然,但是要调用Python脚本的unix用户需要sudo特权(否则不能从subprocess调用sudo)。在这种情况下,您可以执行上述操作,从具有所需权限的用户运行cron。在

可以使用cron运行sudo命令。只需使用sudo crontab-e设置cron,它应该可以正常工作。在

相关问题 更多 >