如何使用 python subprocess.check_output 和 root / sudo

How to use python subprocess.check_output with root / sudo

我正在编写一个 Python 脚本,它将 运行 在 Raspberry 上读取传感器的温度并记录到 Thingspeak。我使用 bash 脚本进行此操作,但不想使用 Python 进行操作,因为这样操作和检查读取值会更容易。传感器读数是通过名为 loldht 的库完成的。我试图这样做:

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

问题是我必须 运行 带 sudo 的库才能访问引脚。我将 运行 脚本作为 cron。可以用 sudo 运行 吗?

或者我可以创建一个 bash 脚本来执行 'sudo loldht' 然后 运行 来自 python 的 bash 脚本吗?

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

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

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

我不知道你用的是哪个OS,但是如果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。

你应该非常小心 运行 事情 root。由于 root 可以访问所有内容,因此一个简单的错误可能会导致系统无法使用。

以普通用户身份访问硬件的正确方法是更改​​所需设备文件的权限。

您提到的实用程序似乎使用 WiringPi library. Some digging in the source code 表示它使用 /dev/gpiomem(或 /dev/mem)设备。

在 raspbian 上,设备权限设置为 udev。参见 here and also here

您可以通过创建文件(例如/etc/udev/rules.d/local.rules 并在其中放入以下文本:

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

第一行使 gpio 设备可用,第二行使 I2C 设备可用。