ImportError: нет модуля с именем <something>

Я знаю, что этот вопрос задавался несколько раз. Я прочитал все из них, но не смог решить мою проблему. Ниже приведена структура каталогов.

ankur
     --ankur1
             __init__.py
             util.py
     --ankur2
             main.py
     --__init__.py

В main.py я импортирую следующее.

import ankur.ankur1.util

Когда я выполняю код в Windows, он отлично работает. Но в Linux я получаю следующую ошибку.

ImportError: No module named ankur.ankur1.util

Я также читаю официальный питон doc о модулях и пакетах.

Ответ 1

Ваша структура пакета в порядке. Ваше выражение на импорт в порядке. Единственное, чего не хватает, так это того, чтобы пакет был виден в sys.path, списке мест, где можно разрешить операторы импорта.

Обычно мы делаем это, "устанавливая" пакет локально с помощью pip, который копирует ваш код в site-packages. Этот каталог является одной из записей в sys.path, поэтому, когда ваш код установлен в пакетах сайта, операторы импорта теперь могут быть разрешены как обычно.

Однако для установки вашего кода вам понадобится установщик (скрипт setup.py) или система сборки (файл pyproject.toml), определенные для пакета. В вашем проекте, похоже, нет установщика или системы сборки, поэтому вам нужно создать ее (подробнее об этом см. Руководство пользователя по упаковке Python), а затем установить пакет с pip. Если вы пока не хотите изучать упаковку Python, вам нужно найти другой способ.

Можно изменить sys.path непосредственно в main.py, что впоследствии позволяет разрешить оператор import ankur.ankur1.util. Это глупо, и я рекомендую против этого. Это добавило бы ограничение на то, что выполнение main.py является единственной точкой входа для остальной части пакета, и поэтому любой другой код, желающий import ankur, сначала должен знать путь к main.py в файловой системе. Это грязный подход и его следует избегать.

Другой способ - использовать среду - есть переменная среды PYTHONPATH, которая может использоваться для расширения пути поиска по умолчанию для файлов модулей. В вашей оболочке:

export PYTHONPATH=/path/to/parent

Где parent - это каталог, содержащий подкаталог ankur.

Точное расположение пакетов сайта зависит от вашей ОС/платформы, но вы можете проверить с помощью import sysconfig; sysconfig.get_paths()["purelib"]