systemd を使用して Python スクリプトをデーモン化できません - 「oandapyV20」という名前のモジュールがありません

systemd を使用して Python スクリプトをデーモン化できません - 「oandapyV20」という名前のモジュールがありません

systemd を使用して Python スクリプトをデーモン化しようとしていますが、デーモンをアクティブ化した後に「'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(仮想環境の Python にはモジュールがインストールされていないようですが、システムの Python にはインストールされているため、対応するものpipも呼び出されているようですoandapyV20)。

出力を調べる

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 が呼び出されます。

関連情報