テクノロジー · 実用ガイド
pip は installed なのに ModuleNotFoundError?interpreter と import path を証明する
失敗した process の Python を特定し、その interpreter の distribution、実際の import name、sys.path を確認して clean import で完了します。

pip install の成功と import failure は、別の interpreter、name、search path を指すなら同時に成立します。
失敗 process の absolute Python を起点に、metadata、name mapping、path resolution、module origin を順に証明します。
失敗 runtime を保存
同じ failure command、working directory、traceback を保存し、その launch path で sys.executable、version、prefix、base_prefix、sys.path を出します。IDE、notebook、service、shebang は別 interpreter を選べます。
最初に sudo pip、--user、global PYTHONPATH、site-packages copy を使いません。failed process が返す absolute executable が最初の証拠です。
その interpreter で distribution を確認
/absolute/python -m pip show <distribution> で Name、Version、Location、必要なら --files を記録します。別の pip の成功は証拠になりません。
distribution が無ければ lock に従い対象 environment に install します。Location が sys.path 外なら activation、user site、pyvenv.cfg、service、container を調べます。
distribution と import name を分離
pip は distribution name、import は import package name を使います。一対一とは限らず Pillow は PIL を import します。
project docs と installed files を確認し、packages_distributions() も利用します。誤った import name だけで install failure と判断しません。
search path を説明し patch しない
sys.path は script/current directory、environment、executable landmarks、venv config、site processing から作られます。python -m site で user site を記録します。
service は user site を無効化でき、IDE/kernel は古く、shebang は別 executable を指せます。最小 launcher boundary を直し global path patch を避けます。
shadowing を除外し exit proof を要求
project の同名 file/folder を確認し、find_spec と成功後の module.__file__ で local shadowing を除外します。
同じ executable が intended Location と import origin を示し、clean process と元 script/test が通った時だけ終了します。全証拠を保存します。
