![Невозможно демонизировать скрипт Python с помощью systemd - нет модуля с именем 'oandapyV20'](https://rvso.com/image/170267/%D0%9D%D0%B5%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B4%D0%B5%D0%BC%D0%BE%D0%BD%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20Python%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20systemd%20-%20%D0%BD%D0%B5%D1%82%20%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%20%D1%81%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BC%20'oandapyV20'.png)
Я пытаюсь демонизировать скрипт 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, что и ваша рабочая команда.