Pythonでライブラリは入っているのにimportできない理由(ModuleNotFoundError/ImportError)


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コマンドが見つからない記事で再現しています。

参考にした公式ドキュメント

検証した環境

この記事の調査・再現・執筆は、運営者の指示のもとで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本体にもパッケージは入れていません

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

トップへ戻る