① 結論
結論:WSLで pip install が成功しているにも関わらず import できない場合、ほとんどの原因はpipがインストールしたPython環境と、実行しているPythonが一致していないことです。特に「pipとpythonのバージョン不一致」「venv未有効化」「sudo pipの使用」が頻発します。python -m pip を基準に切り分ければ確実に解決できます。
② 症状
pip install xxxは成功するが、import xxxでModuleNotFoundError- ターミナルによってimportできたりできなかったりする
- VSCodeでは動かないが、WSLターミナルでは動く(または逆)
- 以前は動いていたのに、環境変更後に動かなくなった
③ 原因(最大3つ)
原因①:pipとpythonの実行バイナリが一致していない
【詳細】
WSLでは複数のPythonが共存しやすく、pip コマンドが別バージョンのPythonに紐づいているケースが多発します。この状態で pip install を実行すると、実行中のPythonとは別の環境にライブラリが入るため、import できません。
起きやすい条件:aptとpyenvの併用、Python複数バージョン導入、VSCode連携
判断ポイント:
which python
which pip
python -m pip --version
python -m pip のパスと which python が一致していなければ不一致です。
原因②:venvを有効化していない(別環境にインストールしている)
【詳細】
venvを作成していても、有効化せずに pip install を実行するとグローバル環境にライブラリが入ります。その後venvを有効化して実行すると、venv側にライブラリが存在せず ModuleNotFoundError が発生します。
起きやすい条件:新しいターミナルを開いた直後、venv自動有効化を期待している場合
判断ポイント:
which python
venv/bin/python を指していなければ、venvは有効化されていません。
原因③:sudo pipでroot環境にインストールしている
【詳細】
sudo pip install を使うと、rootユーザーのPython環境にライブラリが入ります。通常ユーザーで実行しているPythonからは参照できないため、インストール済みにも関わらず import に失敗します。
起きやすい条件:Permissionエラー回避のためsudoを使用した場合
判断ポイント:
pip show パッケージ名
sudo pip show パッケージ名
sudoのみ表示される場合、root環境に入っています。
④ 切り分け手順(コマンド付き)
- 実行中のPythonを確認:
-
which python -
python --version - pipが紐づくPythonを確認:
-
python -m pip --version - 問題のパッケージを直接import:
-
python -c "import パッケージ名; print('ok')" - venv使用時は有効化を確認:
-
source venv/bin/activate
⑤ 解決方法
解決策①:必ず python -m pip を使う
python -m pip install パッケージ名
解決策②:venvを有効化してからインストール
python -m venv venv
source venv/bin/activate
python -m pip install パッケージ名
解決策③:sudo pipで入れたものを整理
sudo pip uninstall パッケージ名
その後、ユーザー環境またはvenvで再インストールします。
⑥ 再発防止
pip単体ではなくpython -m pipを使う- プロジェクトごとにvenvを作成・明示的に有効化
sudo pipを使わない
⑦ それでもダメな場合
- 新しいvenvを作成し、最小構成で再現確認する
python -m venv testenv
source testenv/bin/activate
python -m pip install パッケージ名
python -c "import パッケージ名"
- それでも失敗する場合は、WSLのPython構成自体が壊れている可能性があるため、Pythonの再インストールを検討する

コメント