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 script.py

または仮想環境の有効化

ソース/ホーム/ユーザー/venv/bin/アクティブ化; 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を呼び出し続けます(virtualenvのPythonにはモジュールがインストールされていないようですが、システムPythonには対応する/usr/binPythonもあるようです)。する。)pipoandapyV20

出力を確認してください

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

$PYTHONPATHPythonはロードするモジュールを見つける場所を教えなければなりません。 (を使用してスクリプトから変更または読み取ることもできますsys.path)

これは、システムデバイスを変更するコマンドが機能する理由を説明します。最後に、作業コマンドと同じPythonを呼び出すことになります。

関連情報