Ответ 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"]