我正在尝试使用
gpiozero
来控制 Raspberry Pi 5 上容器中的 GPIO。
我的简单 LED 闪烁应用程序是
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
虽然它在主机上运行良好,但我无法让它在 Docker 容器中运行。当我使用以下命令创建容器时:
docker run --privileged --device /dev/gpiochip4 -v /dev:/dev -v /sys:/sys blinker:latest
我收到错误
Unable to load any default pin factory!
。
这是整个错误跟踪:
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from lgpio: module 'lgpio' has no attribute 'SET_BIAS_DISABLE'
warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from rpigpio: No module named 'RPi'
warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from pigpio: failed to connect to localhost:8888
warnings.warn(
/usr/local/lib/python3.11/site-packages/gpiozero/devices.py:300: PinFactoryFallback: Falling back from native: unable to determine gpio base
warnings.warn(
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Can't connect to pigpio at localhost(8888)
Did you start the pigpio daemon? E.g. sudo pigpiod
Did you specify the correct Pi host/port in the environment
variables PIGPIO_ADDR/PIGPIO_PORT?
E.g. export PIGPIO_ADDR=soft, export PIGPIO_PORT=8888
Did you specify the correct Pi host/port in the
pigpio.pi() function? E.g. pigpio.pi('soft', 8888)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Traceback (most recent call last):
File "//blink.py", line 5, in <module>
led = LED(17)
^^^^^^^
File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 108, in __call__
self = super().__call__(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/gpiozero/output_devices.py", line 192, in __init__
super().__init__(pin, active_high=active_high,
File "/usr/local/lib/python3.11/site-packages/gpiozero/output_devices.py", line 74, in __init__
super().__init__(pin, pin_factory=pin_factory)
File "/usr/local/lib/python3.11/site-packages/gpiozero/mixins.py", line 75, in __init__
super().__init__(*args, **kwargs)
File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 544, in __init__
super().__init__(pin_factory=pin_factory)
File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 245, in __init__
Device.ensure_pin_factory()
File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 270, in ensure_pin_factory
Device.pin_factory = Device._default_pin_factory()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/gpiozero/devices.py", line 302, in _default_pin_factory
raise BadPinFactory('Unable to load any default pin factory!')
gpiozero.exc.BadPinFactory: Unable to load any default pin factory!
为了创建图像,我使用了以下 Dockerfile:
FROM python:3.11
COPY blink.py ./
RUN pip install lgpio pigpio gpio gpiozero
CMD ["python", "blink.py"]
此外,我尝试公开端口 8888,并尝试公开
/dev
文件夹下的不同卷。我验证了守护进程正在使用 sudo pigpiod
和 sudo systemctl enable pigpiod
运行。
我在 GitHub 的存储库中找到了解决方法PY_LGPI。您可以按如下方式更新 Dockerfile:
FROM python:3.11
COPY blink.py ./
RUN pip install lgpio pigpio gpio gpiozero
RUN wget https://github.com/Gadgetoid/PY_LGPIO/releases/download/0.2.2.0/lgpio-0.2.2.0.tar.gz
RUN pip install lgpio-0.2.2.0.tar.gz
CMD ["python", "blink.py"]
然后,您可以使用以下命令运行 Docker 容器:
docker run --privileged blinker:latest
这应该可以解决您面临的问题。