Não é possível daemonizar o script python usando systemd - Nenhum módulo chamado 'oandapyV20'

Não é possível daemonizar o script python usando systemd - Nenhum módulo chamado 'oandapyV20'

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 python3comando (e o pip3comando) 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 piptambém, ao que parece, já que o python no seu virtualenv não parece ter o oandapyV20módulo instalado, enquanto o python do sistema tem).

Examine a saída de

echo $PATH
echo $PYTHONPATH

A $PATHvariá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/binnão está presente nessa lista ou ocorre após uma ocorrência de /usr/bin, que contém uma correspondência para python3( $PATHdeixará de ser verificada após a primeira correspondência.) $PATHgeralmente é definida por $HOME/.bashrc(ou /etc/bashrcse não estiver definida lá) e se sua suposição estiver correta, /home/user/venv/activateestaria configurado $PATHpara anexá /home/user/venv/bin-lo.

$PYTHONPATHdeve 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.

informação relacionada