使用dbus关闭docker容器和python内的Raspberry Pi的电源

问题描述 投票:0回答:1

我正在使用BalenaOS并使用一些python构建docker容器,该python可以感测何时按下按钮,然后应该发送此命令:

dbus-send --system \
    --print-reply=literal \
    --dest=org.freedesktop.login1 \
    /org/freedesktop/login1 \
   "org.freedesktop.login1.Manager.PowerOff" boolean:true

我可以在此容器内打开终端,运行此命令,它确实可以按预期工作。但是,按此按钮只会导致此错误消息(如文章底部所示)

这是我的设置:

dockerfile

FROM balenalib/%%BALENA_MACHINE_NAME%%-debian-python:3.7.4

# Enable systemd init system
ENV INITSYSTEM off

# Set the working directory
WORKDIR /usr/src/app

RUN install_packages git dbus gnome-common

RUN apt-get update
RUN apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0

# Upgrade pip
RUN pip install --upgrade pip
COPY requirements.txt .
RUN pip install --user -r requirements.txt --no-cache-dir --disable-pip-version-check \
                --index-url https://www.piwheels.org/simple

# Copy everything into the container
COPY . ./
#Make sure scripts in .local are usable:
ENV PATH=/root/.local/bin:$PATH
ENV DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host/run/dbus/system_bus_socket
# Start application
CMD ["bash", "start.sh"]

requirements.txt

RPi.Gpio
dbus-python

start.sh

#!/usr/bin/env bash

## connect to the host's system bus from the application container
export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host/run/dbus/system_bus_socket

编辑

[我将dbus-python放弃为pydbus它似乎会产生更好的结果,并且似乎可以简化问题,但仍然会出错。有关两者之间区别的更多信息,请参见https://wiki.python.org/moin/DbusExamples

这里是经过编辑的python

button.py

import RPi.GPIO as GPIO
import time
import pydbus
import gi

# Set GPIO mode: GPIO.BCM or GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

# Set pin 5 an an input, and enable the internal pull-up resistor
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)

oldButtonState1 = True

while True:
    buttonState1 = GPIO.input(5)

    if buttonState1 != oldButtonState1 and buttonState1 == False :
        bus = pydbus.SystemBus()
        logind = bus.get('.login1')['.Manager']
        logind.PowerOff()

    oldButtonState1 = buttonState1

time.sleep(1)

输出现在是:

21.12.19 11:33:53 (-0800)  button      logind.PowerOff()
21.12.19 11:33:53 (-0800)  button    File "/root/.local/lib/python3.7/site-packages/pydbus/proxy_method.py", line 62, in __call__
21.12.19 11:33:53 (-0800)  button      raise TypeError(self.__qualname__ + " missing {} required positional argument(s)".format(-argdiff))
21.12.19 11:33:53 (-0800)  button  TypeError: org.freedesktop.login1.Manager.PowerOff missing 1 required positional argument(s)
21.12.19 11:33:59 (-0800)  button  button.py:12: RuntimeWarning: A physical pull up resistor is fitted on this channel!
21.12.19 11:33:59 (-0800)  button    GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)

[如果我不得不猜测我会说我在python脚本中做错了什么。无法正确使用dbus。

python linux docker raspberry-pi dbus
1个回答
0
投票

感谢stovfl

© www.soinside.com 2019 - 2024. All rights reserved.