![Não é possível daemonizar o script python usando systemd - Nenhum módulo chamado 'oandapyV20'](https://rvso.com/image/170267/N%C3%A3o%20%C3%A9%20poss%C3%ADvel%20daemonizar%20o%20script%20python%20usando%20systemd%20-%20Nenhum%20m%C3%B3dulo%20chamado%20'oandapyV20'.png)
Estou tentando daemonizar um script python usando systemd, mas constantemente recebo o erro "Nenhum módulo chamado 'oandapyV20'" após ativar o daemon.
O script está no local: /home/user/workingdir/script.py
O ambiente virtual está em: /home/user/venv/bin/
Meu melhor palpite sobre como construir o serviço a partir dos documentos que encontrei é o seguinte:
[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
O que funciona...
script python3.py
ou ativando ambiente viral
fonte /home/usuário/venv/bin/ativar; script python3.py
Embora isso funcione fora do serviço, nada do que tentei funciona ao ligar do systemd.
Onde eu estou errando? O que não estou percebendo?
Solução eventual (com pouco entendimento)
[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
Responder1
Parece que você está operando sob a suposição de que sempre que você chamar source /home/user/venv/activate
, o python3
comando (e o pip3
comando) chamará posteriormente o executável relevante de /home/user/venv/bin
.
No entanto, o esclarecimento que você adicionou nos comentários indica que essa suposição estava incorreta. Você não estava chamando o python do seu ambiente virtual durante a execução script.py
; você estava chamando o python /usr/bin
(e seu correspondente pip
também, ao que parece, já que o python no seu virtualenv não parece ter o oandapyV20
módulo instalado, enquanto o python do sistema tem).
Examine a saída de
echo $PATH
echo $PYTHONPATH
A $PATH
variável de ambiente é uma lista separada por dois pontos de caminhos em seu sistema a serem pesquisados quando você insere um comando. Ou /home/user/venv/bin
não está presente nessa lista ou ocorre após uma ocorrência de /usr/bin
, que contém uma correspondência para python3
( $PATH
deixará de ser verificada após a primeira correspondência.) $PATH
geralmente é definida por $HOME/.bashrc
(ou /etc/bashrc
se não estiver definida lá) e se sua suposição estiver correta, /home/user/venv/activate
estaria configurado $PATH
para anexá /home/user/venv/bin
-lo.
$PYTHONPATH
deve informar ao python onde procurar módulos para carregar. (Ele também pode ser modificado ou lido em seu script com a extensão sys.path
.)
Isso explica por que alterar o comando da sua unidade systemd funcionou - finalmente está chamando o mesmo python que seu comando de trabalho fez.