pip install は成功したのに、実行すると ModuleNotFoundError: No module named ... で止まる。原因のほとんどは、ライブラリを入れたPythonと、いま実行しているPythonが別物だということです。
先に結論だけ書くと、次の2行を同じターミナルで実行し、表示される場所がそろっているかを見ます。そろっていなければ、実行に使うPythonで入れ直します。
python3 -c "import sys; print(sys.executable)"
python3 -m pip -V
python3 -m pip install パッケージ名
エラーが ImportError: cannot import name ... や AttributeError: partially initialized module ... の場合は原因が別なので、下の該当する節へ進んでください。
以下の出力は、このサイトの運営に使っているMac(macOS 26.6.2)で、2026年10月19日に一時フォルダで再現したものです。このMacにはAnaconda・Homebrew・Xcode付属のPythonが同居していて、食い違いが起きやすい構成になっています。
最初にエラーの種類を見る
最終行の先頭の語で、確認する場所が決まります。
| 最終行 | 意味 | 確認する場所 |
|---|---|---|
ModuleNotFoundError: No module named 'X' | X という名前のモジュールが、いま動いているPythonから見つからない | どのPythonで実行しているか、そのPythonに入っているか |
ImportError: cannot import name 'Y' from 'X' (パス) | X は見つかったが、その中に Y が無い | カッコ内のパス、名前の綴り、ライブラリの版 |
AttributeError: partially initialized module 'X' ... | 自分のファイルがライブラリと同じ名前で、そちらが読まれた | 作業フォルダのファイル名 |
ModuleNotFoundError は ImportError の一種です。このMacで issubclass(ModuleNotFoundError, ImportError) を確かめると True が返りました。except ImportError: と書いた例外処理は両方を受け止めます。
再現:あるPythonに入れて、別のPythonで読み込む
まず、このMacで python3 と打ったときに候補になるものです。
$ which -a python3
/Users/me/opt/anaconda3/bin/python3
/usr/bin/python3
このほかにHomebrewの python3.11 と python3.12 があります(数字なしの python3 という名前ではPATHに出てきません)。どれが入っているかはpip3がどのPythonを指しているか確認する記事で詳しく調べています。
ネットワークに頼らないよう、一時フォルダで memo_hello という小さな自作パッケージを作り、Homebrewの python3.12 から作った仮想環境へ入れました。そのうえで、5つのPythonから同じ import を試した結果です。
$ python3.12 -m venv venv && venv/bin/python -m pip install --no-index ./memo_hello-0.1-py3-none-any.whl
Processing ./memo_hello-0.1-py3-none-any.whl
Installing collected packages: memo-hello
Successfully installed memo-hello-0.1
$ for py in venv/bin/python python3 /usr/bin/python3 python3.11 python3.12; do echo "== $py"; $py -c "import sys,memo_hello;print(sys.executable, \"OK\")" 2>&1 | tail -1; done
== venv/bin/python
/private/tmp/itm74.y16D/venv/bin/python OK
== python3
ModuleNotFoundError: No module named 'memo_hello'
== /usr/bin/python3
ModuleNotFoundError: No module named 'memo_hello'
== python3.11
ModuleNotFoundError: No module named 'memo_hello'
== python3.12
ModuleNotFoundError: No module named 'memo_hello'
読めるのは入れた仮想環境のPythonだけでした。注目してほしいのは最後の行で、仮想環境の元になった python3.12 自身からも見えません。仮想環境は元のPythonとは別のライブラリ置き場を持つためです。「同じ3.12だから大丈夫」という判断は通用しません。
自分の環境で食い違いを見つける
ふだん打っている python3 がどれで、そのpipがどこに入れるのかを確認します。
$ python3 -c "import sys;print(sys.executable)"; python3 -m pip -V
/Users/me/opt/anaconda3/bin/python3
pip 21.2.4 from /Users/me/opt/anaconda3/lib/python3.9/site-packages/pip (python 3.9)
1行目が実行に使われるPython、2行目の from の後ろがpipの入れ先です。どちらも anaconda3 の下なので、この2つはそろっています。ライブラリを入れたときのpipの表示(上の例なら venv/lib/python3.12/site-packages)と見比べて、場所が違えばそれが原因です。
直し方は、実行に使うPythonを主語にして入れることです。python3 -m pip install パッケージ名 は「いま python3 として動くPythonのpip」を呼ぶので、入れ先と実行先がずれません。仮想環境で作業するなら、先に有効化してから同じ形で入れます。有効化でつまずく場合はvenvが有効化できないときの記事を見てください。
Anacondaの python3 では「たまたま動く」
このMacでは逆の現象も起きます。よく使われる requests を4つのPythonで読み込むと、Anacondaだけが成功しました。
$ for py in python3 /usr/bin/python3 python3.12 venv/bin/python; do echo "== $py"; $py -c "import requests;print(requests.__version__, requests.__file__)" 2>&1 | tail -1; done
== python3
2.26.0 /Users/me/opt/anaconda3/lib/python3.9/site-packages/requests/__init__.py
== /usr/bin/python3
ModuleNotFoundError: No module named 'requests'
== python3.12
ModuleNotFoundError: No module named 'requests'
== venv/bin/python
ModuleNotFoundError: No module named 'requests'
Anacondaは最初から多くのライブラリを抱えています。python3 -m pip list の行数はAnacondaが309行、作ったばかりの仮想環境は4行でした(どちらも見出し2行を含む)。そのため「ターミナルでは動くのに、仮想環境やVS Codeでは ModuleNotFoundError になる」という形で表に出ます。自分で入れた覚えがないのに動いていたなら、Anacondaの持ち物を使っていた可能性があります。
VS Codeで起きている場合は、VS Codeで選択されているPythonを確認・変更する記事とVS Codeで pip install が反映されないときの記事に、画面での確認手順をまとめています。
ImportError: cannot import name が出る場合
こちらはモジュール自体は見つかっています。helpers.py に load_config だけを定義し、存在しない load_settings を読もうとした例です。
$ cat helpers.py
def load_config():
return {"debug": True}
$ cat main.py
from helpers import load_settings
print(load_settings())
$ python3 main.py
Traceback (most recent call last):
File "/private/tmp/itm74.y16D/proj/main.py", line 1, in <module>
from helpers import load_settings
ImportError: cannot import name 'load_settings' from 'helpers' (/private/tmp/itm74.y16D/proj/helpers.py)
末尾のカッコ内が、Pythonが実際に読み込んだファイルです。ここが想定と違うファイルなら名前の衝突、想定どおりなら綴りか版の違いを疑います。ライブラリの版は python3 -m pip show パッケージ名 で確かめられます。
同じフォルダで import helper(sが抜けた名前)にすると、今度は ModuleNotFoundError: No module named 'helper' になりました。ファイルごと見つからないのか、ファイルはあるが中の名前が無いのか、の違いです。
綴りの間違いは、Pythonの版によって助けてくれることがあります。from helpers import load_confg を実行すると、Anacondaの3.9では上と同じ表示だけでしたが、Homebrewの3.12では末尾に候補が付きました。
ImportError: cannot import name 'load_confg' from 'helpers' (/private/tmp/itm74.y16D/proj/helpers.py). Did you mean: 'load_config'?
AttributeError: partially initialized module が出る場合
作業フォルダに標準ライブラリと同じ名前のファイルがあると、そちらが先に読まれます。json.py という名前で import json を書いた例です。
$ cat json.py
import json
print(json.dumps({"a": 1}))
$ python3 json.py
Traceback (most recent call last):
File "/private/tmp/itm74.y16D/shadow/json.py", line 1, in <module>
import json
File "/private/tmp/itm74.y16D/shadow/json.py", line 2, in <module>
print(json.dumps({"a": 1}))
AttributeError: partially initialized module 'json' has no attribute 'dumps' (most likely due to a circular import)
トレースバックの2つ目の File が、標準ライブラリではなく自分の json.py を指しています。Pythonがモジュールを探す順番の先頭は、実行したスクリプトのあるフォルダ(対話的に実行したときは空文字で表されるカレントフォルダ)です。
$ python3 -c "import sys;print(sys.path[:3])"
['', '/Users/me/opt/anaconda3/lib/python39.zip', '/Users/me/opt/anaconda3/lib/python3.9']
対処はファイル名を変えることです。json.py を my_sample.py に変えると、__pycache__ の中に json.cpython-39.pyc が残ったままでも正常に {"a": 1} と表示されました。__pycache__ を消しても害はありませんが、名前を変えるだけで直ります。random.py・email.py・test.py なども同じことが起きる名前です。
No module named pip が出る場合
ライブラリではなくpip自体が見つからない、という表示です。pipを入れずに仮想環境を作ると再現できます。
$ python3.12 -m venv --without-pip nopip
$ nopip/bin/python -m pip -V
/private/tmp/itm74.y16D/nopip/bin/python: No module named pip
$ nopip/bin/pip -V
zsh:1: no such file or directory: nopip/bin/pip
コロンの前に「どのPythonにpipが無いか」が書かれています。別のPythonにはpipがあるかもしれないので、まずこのパスを読みます。そのPythonにpipを戻すには、Python標準の ensurepip を使います。同梱のファイルから入れるので、ネットワークは使いません。
$ nopip/bin/python -m ensurepip --upgrade
Looking in links: $TMPDIR/tmpwu6nbm6v
Processing $TMPDIR/tmpwu6nbm6v/pip-26.1.2-py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-26.1.2
$ nopip/bin/python -m pip -V
pip 26.1.2 from /private/tmp/itm74.y16D/nopip/lib/python3.12/site-packages/pip (python 3.12)
表示されるパスが /usr/bin/python3 やAnaconda、Homebrewのものだった場合は、仮想環境を作ってその中で作業するほうが安全です。sudo を付けて入れるのは避けてください。
入れる名前と import で書く名前が違う
pipで入れる名前(配布物の名前)と、import で書く名前は一致するとは限りません。今回の自作パッケージも、入れる名前は memo-hello、読み込む名前は memo_hello です。Python 3.10以降なら、入っている配布物とimport名の対応を確認できます。
$ venv/bin/python -c "from importlib.metadata import packages_distributions as p; print({k:v for k,v in p().items() if k.startswith(\"memo\")})"
{'memo_hello': ['memo-hello']}
よく知られた例では、pillow は PIL、beautifulsoup4 は bs4、opencv-python は cv2、pyyaml は yaml として読み込みます。ModuleNotFoundError の引用符の中は、Pythonが探したimport名そのものです。
Anaconda・Homebrew・Xcodeが同居するMacで気をつけること
- Homebrewの
python3.12に直接入れようとするとerror: externally-managed-environmentで止まります。ここで別のpip3を試すと、Anacondaなど別の場所に入って食い違いが増えます。このエラーの実際の表示と読み方はpip3がどのPythonを指しているか確認する記事に載せています。 /usr/bin/python3の実体は、このMacではXcodeの中のPython 3.9.6でした(sys.executableが/Applications/Xcode.app/...を指す)。Command Line Toolsだけの環境とは置き場所が違うので、パスは推測せず表示で確認します。- ターミナルで
pythonとpython3の両方が使えるのは、Anacondaが先頭にいるからです。Anacondaを外した環境ではpythonが見つからなくなります。詳しくはpythonコマンドが見つからない記事で再現しています。
参考にした公式ドキュメント
- 組み込み例外(ModuleNotFoundError は ImportError のサブクラス)— Python ドキュメント
- モジュール検索パス — Python チュートリアル
- python -m pip の意味 — pip User Guide
- ensurepip(ネットワークにアクセスしない)— Python ドキュメント
- importlib.metadata — Python ドキュメント
検証した環境
この記事の調査・再現・執筆は、運営者の指示のもとでAIエージェント(AnthropicのClaude)が行い、公開するかどうかは運営者が決めています。載せた出力は、そのAIエージェントがこのMacで実際にコマンドを実行して得たものです。
- macOS 26.6.2(Apple シリコン)、zsh
- Anaconda の Python 3.9.7(pip 21.2.4)。PATHの先頭
- /usr/bin/python3 → Xcode 付属の Python 3.9.6(pip 21.2.4)
- Homebrew の Python 3.11.14(pip 26.0)と 3.12.13(pip 26.1.2)
- 検証日:2026年10月19日。すべて /tmp に作った一時フォルダの中で実行し、上のどのPython本体にもパッケージは入れていません
コメントを残す