python, инициированный с помощью systemd, не может запустить подпроцесс

У меня есть скрипт python внутри virtualenv, который запускается с помощью systemd.

[Unit]
Description=app
After=network.target

[Service]
Type=simple
User=user
Group=user
Environment=VIRTUAL_ENV=/home/user/Projects/app/venv
Environment=PATH=$VIRTUAL_ENV/bin:$PATH
WorkingDirectory=/home/user/Projects/app
ExecStart=/home/user/Projects/app/venv/bin/python app.py

[Install]
WantedBy=multi-user.target

Дело в том, что скрипт использует subprocess.Popen(['python', 'whatever.py']) для открытия другого скрипта Python. Я получил ошибку «не найдено» и обнаружил, что python следует вызывать с абсолютным путем, поэтому я изменил его, и он работал хорошо.

Однако теперь я использую стороннюю библиотеку, pygatt, которая внутри использует подпроцесс для открытия gatttool или hcitool, которые находятся в $PATH (системные двоичные файлы, обычно в /usr/bin).
Так что теперь я не могу изменить эту библиотеку (я мог бы разветвить ее, но, надеюсь, мне не придется).

Почему systemd не может создавать подпроцессы Python без использования абсолютного пути? Без systemd (запускается из консоли) все работает.


person Green Magic    schedule 21.01.2018    source источник
comment
вы уверены, что $VIRTUAL_ENV оценивается в вашем файле конфигурации? может надо поставить Environment=PATH=/home/user/Projects/app/venv/bin:$PATH   -  person Jean-François Fabre    schedule 21.01.2018


Ответы (1)


Я не уверен, но вполне возможно, что настройка среды в одной строке конфигурации не учитывается в следующих.

Environment=VIRTUAL_ENV=/home/user/Projects/app/venv
Environment=PATH=$VIRTUAL_ENV/bin:$PATH

здесь вы ожидаете, что VIRTUAL_ENV будет установлено на $VIRTUAL_ENV, оценивается следующая строка, но это может не сработать. Я бы попробовал жестко запрограммировать вторую строку:

Environment=VIRTUAL_ENV=/home/user/Projects/app/venv
Environment=PATH=/home/user/Projects/app/venv/bin:$PATH
person Jean-François Fabre    schedule 21.01.2018