如何使用 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 设备可用。
我正在编写一个 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 设备可用。