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
とやると見える(下にスクロールするほど古いログが出てくる)。