久々にハマりました。sys.path 追加時点で参照パスが存在しない場合、永久に読み込まれないようです
動作確認環境
Ubuntu 24.04.1 LTS
Python 3.10.12, 3.12.3
pip でインストールしたモジュールが見つからないというのはよくあります (よくないけど)
大体の原因は、
設定されている Python に対する環境変数のパスが誤っている
複数の Python が混在しているために、インストールに使った pip と起動した Python が一致していない
ということが多いかなと思います
まずは Python のバージョンを確認してみましょう
python -V次に Python が保存されている場所を確認してみます
macOS と Linux (Bash / zsh) では which コマンド、Windows (Powershell) では where コマンドを使います
which pythonwhere python起動している Python が pip 時にどの場所を参照しているかは、Python を起動して sys.path で確認できます
python>>> import sys>>> print(sys.path)
私の Ubuntu (Linux) 環境では、以下のように表示されました。この位置にモジュールがあるか確認してみてください
['/usr/lib/python312.zip','/usr/lib/python3.12','/usr/lib/python3.12/lib-dynload','','/home/user/.local/lib/python3.12/site-packages','/usr/local/lib/python3.12/dist-packages','/usr/lib/python3/dist-packages']
また Python の位置と pip の参照先が間違っていないかを確認してみてください
もし異なっている場合は、環境変数等の問題のあるパスを解決する必要があります
が、ひとまず応急処置で良い場合は、以下のようにモジュールを再インストールすると読み込まれるかもです
python -m pip install <module>そもそも Anaconda をお使いの場合は pip ではなく conda コマンドを使ってくださいね
conda install <module>どうしても解決しない場合は、すべての Python 環境をアンインストールして、再度インストールします
その際には pyenv 等の Python 環境管理ツールを使うと便利です
さて、やっと本題なのですが、今回ハマったのは pip によるモジュールのインストール先を変更したからでした
モジュールのインストール先は、環境変数で PIP_TARGET を指定することで任意の場所に変更できます
PIP_TARGET=/home/user/hogehoge pip install <module>で、インストールしたモジュールの参照先を Python に伝える必要がありますが、2つ方法があります
1つは、環境変数 PYTHONPATH に追加する方法で、モジュールの参照先が追加されます
PYTHONPATH=/home/user/hogehoge python fugafuga.pyもう1つは、Python のスクリプト内で sys.path に追加する方法です
PYTHONPATH で指定したものも sys.path の先頭に追加されています (おそらく起動時に自動で append されていそう)
import syssys.path.append('/home/user/hogehoge')
これらは pip でインストールした外部配置のモジュールを参照するためというよりは、自分で作った取り回しの効くモジュールを呼び出したりするためにパスに追加するという方が本来の使い方のようです
以上のような普通の使い方をしていれば問題ないのですが、私は
PYTHONPATH で Python 起動前に存在しないディレクトリを指定した
Python 起動中に PYTHONPATH のディレクトリを作成した
Python 起動中に PIP_TAGERT (PYTHONPATH) で指定したディレクトリに pip でモジュールをインストールした
というトリッキーな方法を使ってしまったために、モジュールが認識されませんでした
つまり PYTHONPATH に存在しないディレクトリを指定すると sys.path に追加されていても、そのディレクトリのモジュールは読み込まれませんでした
それどころか sys.path から 一度削除して再度追加してもダメでした
存在しないディレクトリの PYTHONPATH の事前指定は、どうやら禁忌事項のようです
解決方法としてはシンプルで、事前にディレクトリを作成しておくだけで良かったようです
例えば /home/user/hogehoge にインストールしたい場合は、事前にディレクトリを作成しておきます
mkdir -p /home/user/hogehogeこれで、後追いで追加しても認識されました 🎉
おわりに
JupyterHub の環境構築時に、ユーザごとに環境を分けるために使ったときにハマりました 🦉
あまりこのような使い方をする人はいないかなと思いますが、誰かのお役に立てれば... 🐶