ModuleNotFoundError: No module named 'pandas' значит, что Python, который запустил скрипт, не нашёл модуль ни в одном каталоге своего пути поиска. Обычно пакет не установлен или установлен в другой интерпретатор. Бывает, что мешает собственный файл с именем библиотеки или скрипт запущен не из той папки.
Вывод в примерах снят на Python 3.14.3 и pip 25.3 в Windows 10, пути сокращены.
- Как читать traceback
- Какой Python запускает код, а какой pip ставит пакеты
- Модуль не установлен
- pip поставил пакет в другой интерпретатор
- Виртуальное окружение не активировано
- Редактор и Jupyter запускают свой Python
- Имя пакета для pip не совпадает с именем модуля
- Свой файл с именем библиотеки
- No module named ‘app’: скрипт запущен не из той папки
- No module named distutils и pkg_resources
- Частые вопросы
- Как сделать модуль необязательным?
- Как не получить ошибку на другом компьютере?
Как читать 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.

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 есть подсказка переименовать файл.

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.








