ModuleNotFoundError: No module named в Python: причины и как исправить

Разработчик за ноутбуком смотрит на сообщение об ошибке в терминале Программирование и разработка

ModuleNotFoundError: No module named 'pandas' значит, что Python, который запустил скрипт, не нашёл модуль ни в одном каталоге своего пути поиска. Обычно пакет не установлен или установлен в другой интерпретатор. Бывает, что мешает собственный файл с именем библиотеки или скрипт запущен не из той папки.

Вывод в примерах снят на Python 3.14.3 и pip 25.3 в Windows 10, пути сокращены.

Как читать traceback

Traceback (most recent call last):
  File "C:\project\main.py", line 1, in <module>
    import pandas as pd
ModuleNotFoundError: No module named 'pandas'

Traceback читают снизу вверх. Последняя строка называет модуль, строка над ней показывает import, который упал, а File ... line 1 даёт файл и номер строки. Если имя в кавычках ваше ('app', 'config'), ищите причину в структуре проекта. Если это библиотека, проверяйте установку. Так же снизу вверх читается TypeError: can only join an iterable в разборе задачи «Фруктовый салат» на Python.

С версии 3.6 ModuleNotFoundError наследует от ImportError, поэтому старый код с except ImportError его тоже ловит.

Какой Python запускает код, а какой pip ставит пакеты

Добавьте в начало скрипта две строки и запустите его так же, как обычно, из редактора или терминала:

import sys
print(sys.executable)

Затем в терминале, где ставите пакеты, выполните pip --version. В прогоне в терминале осталось активным окружение другого проекта, а скрипт запускался интерпретатором .venv текущего. Скрипт напечатал:

C:\project\.venv\Scripts\python.exe

А pip ответил:

pip 25.3 from C:\old-project\.venv\Lib\site-packages\pip (python 3.14)

После pip install tqdm пакет ушёл в чужое окружение, и скрипт упал с No module named 'tqdm'. Оба пути должны вести в одну папку. Не совпали: ставьте пакет тем интерпретатором, который напечатал скрипт, C:\project\.venv\Scripts\python.exe -m pip install tqdm.

Модуль не установлен

Ставим пакет тем же интерпретатором, которым запускаем код:

python -m pip install pandas
Successfully installed numpy-2.5.3 pandas-3.0.6 python-dateutil-2.9.0.post0 six-1.17.0 tzdata-2026.5

После этого main.py печатает 3.0.6. Вместе с pandas pip поставил его зависимости, в том числе numpy. Голой команде pip мы бы не доверяли: оболочка находит первый pip в PATH, и он не всегда принадлежит тому Python, что запускает скрипт. python -m pip запускает pip именно этого python. На Windows есть ещё py -m pip: без активного окружения он берёт последнюю установленную версию Python.

Читайте также:  Циклы с условием: while, for и do while на примерах

Крупный план рук на клавиатуре, на экране размытая консоль

pip поставил пакет в другой интерпретатор

Системный python -m pip install pandas отвечает, что всё уже есть, а скрипт в окружении проекта всё равно падает:

Requirement already satisfied: pandas in c:\users\user\appdata\local\python\pythoncore-3.14-64\lib\site-packages (2.3.3)

Путь в ответе принадлежит системному Python, а скрипт запускается из виртуального окружения проекта, где pandas нет. Решение: поставить пакет в окружение через его собственный python -m pip.

Виртуальное окружение не активировано

Пока окружение не активировано, команда python вызывает системный интерпретатор. Пакет tabulate стоял только в .venv, и без активации скрипт упал с No module named 'tabulate', а после активации напечатал таблицу. Команды активации:

Оболочка Команда
Linux, macOS (bash, zsh) source .venv/bin/activate
Windows, cmd.exe .venv\Scripts\activate.bat
Windows, PowerShell .venv\Scripts\Activate.ps1

Если в Windows 10 политику выполнения скриптов в PowerShell никто не менял, первая попытка заканчивается так:

.venv\Scripts\Activate.ps1 : Невозможно загрузить файл C:\project\.venv\Scripts\Activate.ps1, так как выполнение сценариев отключено в этой системе.

Окружение при этом не включилось, и следующий python снова системный. Разрешить скрипты для своего пользователя можно командой Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser. Если хватит текущего окна, подойдёт та же команда с -Scope Process. Активация вообще не обязательна: .venv\Scripts\python.exe main.py запускает код нужным интерпретатором и без неё.

Редактор и Jupyter запускают свой Python

VS Code берёт интерпретатор, выбранный в проекте: Ctrl+Shift+P, команда «Python: Select Interpreter», указать .venv. В Jupyter ставьте пакеты из ячейки командой %pip install pandas: она ставит пакет в окружение текущего ядра.

Два монитора с размытыми окнами редактора кода и терминала

Имя пакета для pip не совпадает с именем модуля

В коде пишут import cv2, а пакет называется иначе. Попытка поставить его по имени модуля:

ERROR: No matching distribution found for cv2

С sklearn pip скачивает пакет-заглушку, и та падает с подсказкой:

  The 'sklearn' PyPI package is deprecated, use 'scikit-learn'
  rather than 'sklearn' for pip commands.
Пишете в коде Ставите через pip
import sklearn scikit-learn
import cv2 opencv-python
import PIL pillow
import yaml pyyaml
import bs4 beautifulsoup4

С bs4 pip не откажет: под этим именем лежит обёртка-заглушка, которая тянет за собой beautifulsoup4.

Если пакет у вас уже стоит и надо узнать его имя для requirements.txt, спросите сам Python:

from importlib.metadata import packages_distributions

names = packages_distributions()
for module in ["sklearn", "cv2", "yaml", "PIL", "bs4"]:
    print(module, "->", names[module])
sklearn -> ['scikit-learn']
cv2 -> ['opencv-python']
yaml -> ['PyYAML']
PIL -> ['pillow']
bs4 -> ['beautifulsoup4']

Свой файл с именем библиотеки

Если учебный скрипт по графикам в Matplotlib сохранить как matplotlib.py, Python первым делом найдёт сам этот файл в папке скрипта и импортирует его вместо библиотеки:

ModuleNotFoundError: No module named 'matplotlib.pyplot'; 'matplotlib' is not a package

Хвост is not a package выдаёт причину: Python нашёл одиночный файл там, где ждал пакет. Переименуйте его, например в plot_demo.py. Остаток в __pycache__ удалять не нужно, без исходника его не используют. Тот же конфликт с pandas.py заканчивается уже AttributeError при обращении к функции библиотеки. Начиная с Python 3.13 в этом AttributeError есть подсказка переименовать файл.

Читайте также:  Строки в PHP: кавычки, echo, функции и работа с UTF-8

Папка проекта в файловом менеджере на экране ноутбука, иконки файлов без подписей

No module named ‘app’: скрипт запущен не из той папки

В корне проекта лежит пакет app из трёх файлов: __init__.py, utils.py и main.py, где написано from app.utils import greet. Запуск из корня:

python app/main.py
ModuleNotFoundError: No module named 'app'

При запуске файла первым местом поиска становится каталог самого скрипта, то есть app, текущий каталог в путь не попадает. Вложенного пакета app внутри нет. Запускайте модулем:

python -m app.main
Привет, мир!

Флаг -m (module) запускает модуль как скрипт, и первым в пути поиска стоит текущий каталог, поэтому пакет находится. Тот же приём чинит относительный импорт from .utils import greet: при запуске файлом он падает с ImportError: attempted relative import with no known parent package. Дописывать sys.path.append() в начало скрипта мы бы не советовали: импорт начинает зависеть от того, какой файл запустили первым.

No module named distutils и pkg_resources

В Python 3.12 модуль distutils убрали из стандартной библиотеки, а venv перестал ставить setuptools. В свежем окружении оба импорта падают. python -m pip install setuptools возвращает distutils, но не pkg_resources: его удалили из setuptools 82. Для старой библиотеки, которой он нужен, есть временный выход:

python -m pip install "setuptools<82"

С версией 81.0.0 импорт проходит, но с предупреждением pkg_resources is deprecated as an API. Лучше обновить библиотеку, которая его требует.

Ноутбук на рабочем столе ночью, экран с размытым кодом подсвечивает чашку

Частые вопросы

Как сделать модуль необязательным?

Обернуть импорт в try и ловить именно ModuleNotFoundError:

try:
    import yaml
except ModuleNotFoundError as err:
    print("Не найден модуль:", err.name)
    yaml = None

В окружении без pyyaml скрипт печатает Не найден модуль: yaml и работает дальше.

Как не получить ошибку на другом компьютере?

Записать зависимости: python -m pip freeze > requirements.txt, а на новой машине в активированном окружении выполнить python -m pip install -r requirements.txt.

Оцените статью
bestprogrammer.ru
Добавить комментарий