
Я пытаюсь демонизировать скрипт 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, что и ваша рабочая команда.