Python: ModuleNotFoundError: модуль не назван...?

Я пытаюсь запустить очень простой проект Python на VScode/Pycharm.

Структура каталогов

PythonAnalyticalProject/
├── sales_analysis/
│   ├── __init__.py
│   ├── cli.py
│   ├── constants.py
│   ├── db.py
│   ├── sales_analysis.py   (contains main)
├── images/
│   ├── image1.png/
│   └── image2.png/
├── setup.py
└── requirements.txt

Я установил зависимости require.txt, а также добавил каталог проекта в PYTHONPATH.

Но я все еще получаю сообщение об ошибке при выполнении sales_anaанализ.py.

ModuleNotFoundError: No module named 'sales_analysis.cli'; 'sales_analysis' is not a package

Эта ошибка возникла в строке, содержащей оператор импорта.

from sales_analysis.cli import user_continue

Как мне решить эту ошибку. Кажется, я выполнил все необходимые настройки, но ошибка все еще сохраняется.

У вас есть файл Python и папка модуля с именем sales_analysis. Вы намеревались импортировать модуль, но сначала он нашел файл. Самое простое решение — переименовать один из них.

John Gordon 01.07.2024 20:27

И он не НАЙДЕТ модуль, если текущий каталог находится внутри sales_analysis. Вам нужно будет добавить родительский каталог в путь Python. Либо так, либо просто делайте import cli.

Tim Roberts 01.07.2024 20:33

Я предполагаю, что вы не писали этот код, а просто пытаетесь его запустить. В этом случае вам следует подать заявку об ошибке, чтобы исправить код и/или инструкции по использованию. Однако если вы пишете код, сначала извлеките минимальный воспроизводимый пример.

Ulrich Eckhardt 01.07.2024 20:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Короткий ответ

Переименуйте папку sales_anasis или файл sales_anasis.py, чтобы избежать конфликта имен.

Длинный ответ

Поскольку вы используете sales_anaанализ.py, было бы целесообразнее заменить:

питон

from sales_analysis.cli import user_continue

с:

питон

from .cli import user_continue

Это изменение необходимо, поскольку в каталоге уже есть папка. Если вы запустите setup.py, проблем с именованием папок не возникнет.

Используя относительный импорт (из .cli import user_continue), вы правильно ссылаетесь на модуль cli в том же пакете. Такой подход обеспечивает совместимость и позволяет избежать конфликтов с именами пакетов.

Для получения дополнительной информации вы можете обратиться к статьям по RealPython

Запуская код как python path/to/sales_analysis/sales_analysis.py, вы неявно добавляете path/to/PythonAnalyticalProject/sales_analysis/ к PYTHONPATH. Когда путь добавляется таким образом, он также будет первой записью, которая будет проверяться на наличие модулей и пакетов! Это означает, что import sale_analysis будет искать PythonAnalyticalProject/sales_analysis/sales_analysis.py вместо PythonAnalyticalProject/sales_analysis/ в качестве источника модуля/пакета sales_analysis.

Чтобы не добавлять path/to/PythonAnalyticalProject/sales_analysis/ к PYTHONPATH, запустите код следующим образом:

python -m sales_analysis.sales_analysis

Есть три способа решить эту проблему:

  1. Измените имя каталога sales_analysis на другое имя. Помните, не меняйте имя файла sales_analysis.py Python.

  2. Измените оператор импорта на импорт с использованием точечной записи:

    from .cli import user_continue

  3. Альтернативно вы можете изменить оператор импорта на импорт полного пути, например:

    from PythonAnalyticalProject.sales_analysis.cli import user_continue

Другие вопросы по теме