テクノロジー · 実用ガイド

端末では動くのに systemd で ModuleNotFoundError?直ちに再インストールせず境界を証明

サービスの Python、prefix、ユーザー、作業ディレクトリ、sys.path を記録し、差が証明された境界だけを直して同じプローブを再実行します。

オリジナルイラスト:Python、ユーザー、cwd、sys.path の比較。
オリジナルイラスト:shell と systemd で同じ事実を採取。 Watch at Ease

systemd だけで起きる ModuleNotFoundError は、証拠が出るまで実行境界の差として扱います。Python、venv、ユーザー、HOME、cwd、検索パスが端末と異なる可能性があります。

sudo pip、chmod、全体 PYTHONPATH、activate から始めません。同じ小さなプローブを両環境で取り、差を一つずつ可逆に直します。

失敗した service と成功した shell を固定

unit、重要 property、journal traceback を保存し、秘密は記録しません。

成功 shell と service identity で同じ id、pwd、Python、pip、probe を採取します。

import 境界台帳を作る

executable、prefix、cwd、uid/gid、HOME、sys.path、find_spec を記録します。

同じ Python の -m pip show を使い、別 pip の一覧を証拠にしません。

最初の差を分類

Python が違えば ExecStart を venv の Python にします。activate は不要です。

cwd だけ違えば絶対 WorkingDirectory または packaging を修正します。

症状でなく package 境界を修復

再現可能で service user が読める環境を使い、その Python の -m pip を使います。

Environment は非秘密だけ。狭い PYTHONPATH は試験に限定し root で隠しません。

reload・restart・再測定

必要なら daemon-reload と restart 後、同じ台帳を再取得します。

実ジョブと journal を確認し、再起動後も最小権限で import できて完了です。

失敗分岐で誤修復を避ける

pip show 成功・find_spec 空なら distribution/import 名、optional build、editable path を確認します。

200/CHDIR は cwd、ExecStart 不在は実行ファイルを先に直します。

オリジナルイラスト:観測から限定修復と検証へ進む流れ。
オリジナルイラスト:証拠で異なる境界だけを変更。 Watch at Ease