如何在 Flask 中使用具有 sudo 权限的 python 包?

How to use a python package with sudo privileges inside Flask?

我通过 this 教程在我的 Raspberry Pi 4 模型 B 中设置了 Flask。

OS = Ubuntu 服务器 20.04.2 LTS
Python = 3.8

请记住,我正在为我的 Flask 应用程序使用虚拟环境,如教程中所示,我的 Flask 应用程序运行绝对没问题。

现在我在同一个 venv 中安装了 Adafruit_DHT 并尝试在其中一个端点中使用以下代码

import Adafruit_DHT
humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, 24)

我收到以下错误

File "/usr/local/lib/python3.8/dist-packages/Adafruit_DHT/common.py", line 81, in read
    return platform.read(sensor, pin)
  File "/usr/local/lib/python3.8/dist-packages/Adafruit_DHT/Raspberry_Pi_2.py", line 34, in read
    raise RuntimeError('Error accessing GPIO.')
RuntimeError: Error accessing GPIO.

所以,在那之后,我创建了一个简单的 python 脚本说 z.py 并在其中编写了上面的代码。然后,我使用

激活了相同的 Flask venv
source venv1/bin/activate

并且运行脚本使用

python z.py

我又遇到了同样的错误。但是如果我 运行 上面的命令是 sudo

sudo python z.py

然后脚本执行得非常好,我得到了以下响应

87.0999984741211 29.399999618530273

那么,现在问题来了,如何在具有 sudo 权限的 Flask 应用程序中使用 Adafruit_DHT 包?

我认为将 777 设置为 www-data 组不是正确的选择。或者 运行将 Flask 应用程序作为 sudo 用户是个好主意。

我已经尝试使用 sudo 全局安装 Adafruit_DHT 软件包,但我仍然必须执行 z.py 作为 sudo

那么正确的做法是什么?

我相信程序包将尝试访问设备 /dev/gpiomem(可能是(/dev/gpiochip0 或 /dev/gpiochip1)。

我认为解决这个问题的最简单方法是让这些设备由 root 以外的组拥有,并授予该组访问设备的权限,例如

sudo su
groupadd gpio
chgrp gpio /dev/gpio*
chmod g+rw /dev/gpio*

然后我会继续将您的用户添加到该组(默认情况下这是 ubuntu,但您可能已经创建了另一个用户):

usermod -a -G gpio ubuntu

现在您已经创建了一个名为“gpio”的组,该组现在有权访问您的 Pi 的 GPIO,并将您的用户添加到该组。

请注意,我还没有测试过这个