Отредактировано для добавления:Ваша программа пытается получить доступ к графическому рабочему столу пользователя (pi
), однако сама выполняется systemd. То есть по умолчанию он будет работать как root, а не как пользователь pi
. Более того, на момент запуска может даже не быть графического рабочего стола.
Следовательно, можно было пойти несколькими путями:
~/.xinitrc
или ~/.xprofile
. См. Arch Wiki по автозапускуUser=pi
в службу systemd. Это решение, которое вы упомянули в комментарии к исходному сообщению Оригинальный ответ:
См. этот вопрос SO . В функции subprocess.Popen(.)
есть параметр env=
, который можно использовать.
В качестве альтернативы вы можете использовать функцию sh
, которая заключается в том, что если вы назначаете переменную непосредственно перед вызовом, эта переменная устанавливается (только )для этого вызова:
myvar=world
# cannot use echo $myvar, because $myvar would be substituted before echo is launched
myvar=hello declare -x myvar
echo $myvar
дает
declare -x myvar="hello"
world
Ссылка на соответствующую главу в спецификации POSIX
Так для вас:
subprocess.call("DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-goOEk5dZcK,guid=9c1f14175e6be0992b16e5155969b46c notify-send 'Battery full!'",shell=True)
Вызов, который вы упомянули в комментарии к вашему вопросу, не работает, так как приводит к следующему процессу
subprocess.Popen('export DBUS_SESSION_BUS_ADRESS=..., shell = True)
Установите переменную окружения DBUS_SESSION_BUS_ADRESS=...
для этой оболочки. и все вспомогательные -оболочки (вот что делает export
).
Что он делает НЕ:Установить переменную для всех оболочек, которые есть на машине!
DBUS_SESSION_BUS_ADRESS
снова потеряно.subprocess.Popen(['notify-send',...], shell=True)
export
предыдущей оболочки здесь не имеет силы, потому что эти две оболочки совершенно не связаны notify-send
как в исходном вопросе Таким образом, установка переменной окружения здесь не действует.
для ALSA и Raspberry Pi-https://github.com/pimoroni/pivumeter
на основании этого-http://laugeo.free.fr/ameter.html