如何使用Python subprocess.check_output以root / sudo身份运行

4

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

看起来我也可以使用subprocess模块中的check_output函数来执行这个命令: check_output(["sudo", "/home/pi/bin/lol_dht22/loldht", "7"], timeout=10)。 - Mathias Rönnlund
问题在于需要调用Python脚本的用户在sudo列表中(否则该用户无法调用sudo),因此你又回到了我的答案:将命令放入特权用户中,这种情况下你就不需要在子进程中使用sudo。 - bakkal
3个回答

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权限(否则无法从subprocess中调用sudo)。 在这种情况下,您可以像上面那样运行具有所需权限的用户的cron。

2

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


我正在做类似的事情,使用无密码访问另一个帐户下的脚本,并使用命令 sudo -u acctname scriptname.sh,但它无法从cron运行,尽管相同的命令可以从提示符中运行。有什么想法吗? - amickj

1

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

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

似乎你提到的实用程序使用WiringPi库。在源代码中进行一些挖掘表明它使用/dev/gpiomem(或/dev/mem)设备。

在raspbian上,设备权限是通过udev设置的。请参见此处此处

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

谢谢。我还没有尝试过,也还没有决定是否应该将作业放在具有足够权限的用户的cron中,或者让每个人都可以使用gpio。 - Mathias Rönnlund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接