Невозможно демонизировать скрипт Python с помощью systemd - нет модуля с именем 'oandapyV20'

Невозможно демонизировать скрипт Python с помощью systemd - нет модуля с именем 'oandapyV20'

Я пытаюсь демонизировать скрипт Python с помощью systemd, но постоянно получаю ошибку «Нет модуля с именем 'oandapyV20'» после активации демона.

Скрипт находится по адресу: /home/user/workingdir/script.py

Виртуальная среда находится по адресу: /home/user/venv/bin/

Мое лучшее предположение о том, как создать службу, исходя из найденной мной документации, выглядит следующим образом:

[Unit]
Description=DataLoader
[Service]
User=root
Group=root
WorkingDirectory=/home/user/workingdir
ExecStart=/home/user/venv/bin/python3 script.py
[Install]
WantedBy=multi-user.target

Что работает...

скрипт python3.py

или активация виртуальной среды

источник /home/user/venv/bin/activate; python3 script.py

Хотя это работает вне службы, ничего из того, что я пробовал, не работает при вызове из systemd.

Где я ошибаюсь? Чего я не понимаю?

Окончательное решение (с небольшим пониманием)

[Unit]
Description=DataLoader
[Service]
User={user_name}
Group={user_name}
WorkingDirectory=/home/{user_name}/workingdir
ExecStart=/usr/bin/python3 script.py
Restart=always
[Install]
WantedBy=multi-user.target

решение1

Похоже, вы действовали, исходя из предположения, что всякий раз, когда вы вызывали source /home/user/venv/activate, python3команда (и pip3команда) впоследствии вызывали соответствующий исполняемый файл из /home/user/venv/bin.

Однако, пояснение, которое вы добавили в комментариях, указывает на то, что это предположение было неверным. Вы не вызывали python из вашей виртуальной среды при запуске script.py; вы вызывали python в /usr/bin(и его соответствие pip, похоже, тоже, поскольку python в вашей virtualenv, похоже, не имеет oandapyV20установленного модуля, в то время как системный python имеет.)

Проверьте вывод

echo $PATH
echo $PYTHONPATH

Переменная окружения $PATH— это разделенный двоеточиями список путей в вашей системе, по которым будет выполняться поиск при вводе команды. Либо /home/user/venv/binотсутствует в этом списке, либо встречается после вхождения /usr/bin, которое содержит совпадение для python3( $PATHперестанет сканироваться после первого совпадения.) $PATHобычно устанавливается $HOME/.bashrc(или /etc/bashrcесли не установлено там) и если бы ваше предположение было верным, /home/user/venv/activateто было бы установлено $PATHдля добавления /home/user/venv/binк нему.

$PYTHONPATHдолжен указать python, где искать модули для загрузки. (Его также можно изменить или прочитать из вашего скрипта с помощью sys.path.)

Это объясняет, почему изменение команды вашего модуля systemd сработало — он наконец-то вызывает тот же Python, что и ваша рабочая команда.

Связанный контент