Systemdで自動起動するようにしたPythonが動いてない!?

症状

Linuxの起動時に自分で書いたPythonのコードを自動起動するようにユニットファイルを書き、systemctl startでサービスを開始した。
しかし、systemctl statusでサービスを確認すると、なぜか実行に失敗している。
ターミナルにて手動でコードを起動した際にはうまく実行していたのに、なぜだろう。

原因

Systemdが起動したPythonでは、手動で起動したPythonに比べてモジュール検索パス(sys.path)が足りない。具体的には、
'/home/[ユーザー名]/.local/lib/python3.7/site-packages'
のパスが抜け落ちてしまう。

手動で起動したPythonのモジュール検索パス

['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/home/[ユーザー名]/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages']

Systemdが起動したPythonのモジュール検索パス

['[コードが置かれているパス]', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/dist-packages', '/usr/lib/python3/dist-packages'

これでは、'/home/[ユーザー名]/.local/lib/python3.7/site-packages'にインストールしているモジュールを使用するコードだったら、モジュールが見つからなくてエラーを起こしてしまう。

対処法

モジュールをインポートする前に '/home/[ユーザー名]/.local/lib/python3.7/site-packages' をモジュール検索パス(sys.path)へ追加する。

おまけ

Systemdが起動したPythonのエラーは

journalctl -u [ユニットファイル名] -r | less

とやると見える(下にスクロールするほど古いログが出てくる)。

いいなと思ったら応援しよう!