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