Если Python импортирует файл из вашего проекта вместо установленного пакета, сначала определите файл, который загружает Python. В macOS проверьте активный интерпретатор, путь к импортированному модулю и любые файлы или папки проекта с таким же именем. Переименуйте конфликтующий локальный файл, при необходимости удалите устаревший кэш байт-кода и запустите проект в нужной среде Python.
1. Проверьте, какие Python и модуль используются
В Terminal перейдите в папку проекта и запросите у Python информацию об источнике модуля. Замените requests именем импорта, который вызывает ошибку; например, пакет, установленный как Pillow, импортируется как PIL.
cd "/path/to/your/project"
command -v python3
python3 -c 'import sys, importlib.util; name = "requests"; print("Python:", sys.executable); print("Module:", importlib.util.find_spec(name))'
Результат со значением origin внутри каталога вашего проекта, например .../requests.py, указывает на локальный файл, перекрывающий пакет (shadowing). Python помещает каталог скрипта или текущий рабочий каталог в начало пути поиска, поэтому локальный модуль с таким же именем может иметь приоритет над установленным пакетом. Документация по пути поиска модулей в Python
Если команда возвращает None, этот интерпретатор не может найти модуль с таким именем. Если она показывает путь в site-packages, коллизия может быть в другом месте: ваше приложение может запускать другой интерпретатор, имя импорта может отличаться от имени установки пакета, либо ошибка может возникать внутри зависимости пакета.
2. Найдите и переименуйте локальный конфликтующий файл
Поищите в проекте файл с именем, совпадающим с именем импорта, например requests.py, или каталог с таким именем. Также проверьте наличие распространенных имен стандартной библиотеки, таких как email.py, json.py или typing.py. Переименуйте файл или каталог, присвоив уникальное для проекта имя, затем обновите все импорты, которые ссылались на этот локальный модуль. Не переименовывайте его просто в имя другого популярного пакета или модуля стандартной библиотеки.
Если конфликтующий файл является преднамеренным модулем проекта, сохраните его, но задайте уникальное имя и импортируйте через структуру пакетов вашего проекта. Файл проекта, случайно названный так же, как сторонний пакет, с высокой вероятностью приводит к запутанным частичным импортам или ошибкам об отсутствующих атрибутах.
После переименования удалите соответствующий каталог __pycache__, только если он остался рядом со старым файлом. Обычно Python автоматически проверяет время изменения исходных файлов и обновляет кэш байт-кода; удаление соответствующего кэша — это шаг очистки, а не замена устранению конфликта имен. Документация Python по модулям и байт-коду
3. Убедитесь, что пакет относится к запускаемому Python
В macOS часто установлено несколько версий Python или сред проекта. Исполняемый файл, показанный как sys.executable, — это интерпретатор, стоящий за только что выполненной командой. Устанавливайте пакеты через этот интерпретатор, чтобы pip и Python случайно не ссылались на разные среды:
python3 -m pip show requests
python3 -m pip install requests
Используйте дистрибутивное имя пакета в pip show и его имя импорта в Python. Они могут различаться; например, Pillow обычно импортируется как PIL. Результат «package not found» («пакет не найден») от pip show означает, что этот дистрибутив не установлен для интерпретатора, используемого этой командой.
Для создания среды под конкретный проект создайте и активируйте виртуальное окружение из каталога проекта, а затем установите зависимость туда:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests
python -c 'import requests; print(requests.__file__)'
При активном окружении python должен разрешаться в его интерпретатор. Последняя команда выводит фактический путь к загруженному файлу; убедитесь, что он находится внутри .venv, а не на верхнем уровне вашего проекта. Виртуальные окружения изолируют пакеты проекта от других сред и создаются с помощью python -m venv. Документация по venv в Python
4. Проверьте переопределения путей и перезапустите заново
Если модуль по-прежнему разрешается в неожиданное местоположение, проверьте путь поиска Python и любое переопределение PYTHONPATH:
python -c 'import os, sys; print("PYTHONPATH:", os.environ.get("PYTHONPATH")); print("sys.path:"); print("\n".join(sys.path))'
sys.path инициализируется с использованием PYTHONPATH и настроек по умолчанию, зависящих от установки; при стандартных вызовах Python также добавляет в начало каталог скрипта или текущий рабочий каталог. Удалите нежелательное значение PYTHONPATH из текущей оболочки с помощью unset PYTHONPATH, затем повторно запустите диагностику. Для постоянных настроек проверьте файл автозагрузки оболочки, в котором оно было задано, и удалите или исправьте соответствующую инструкцию экспорта. Документация по sys.path в Python
Перезапустите процесс Python после переименования файлов или смены сред: уже запущенный интерпретатор может сохранять импортированные модули в памяти. Затем повторите проверку источника и запустите команду или приложение обычным способом. Если источник правильный, но импорт все равно завершается с ошибкой, изучите полный traceback; он может указывать на недостающую зависимость или ошибку, возникшую во время загрузки пакета, а не на коллизию имен.
Источники
6. Modules — Python Software Foundation
sys — System-specific parameters and functions — Python Software Foundation
venv — Creation of virtual environments — Python Software Foundation