如何在root / sudo中使用python subprocess.check_output

时间:2016-01-01 20:47:11

标签: python subprocess sudo

我正在编写一个将在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脚本?

3 个答案:

答案 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。请参阅herehere

您可以通过创建文件,例如每个用户授予/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设备。