Импорт подпакетов проекта в Python

Я экспериментирую с DDD в Python и решил реализовать игрушечный проект.

Я создал различные каталоги, чтобы отделить общие концепции от конкретных концепций ограниченных контекстов.

При попытке импортировать эти файлы я сталкиваюсь с No module named error исключениями

Например, при такой структуре проекта:

.
└── src/
    ├── Book/
    │   ├── application
    │   ├── domain/
    │   │   ├── Book.py
    │   │   └── __init__.py
    │   ├── infrastructure
    │   └── __init__.py
    └── Shared/
        ├── application
        ├── domain/
        │   ├── Properties/
        │   │   ├── __init__.py
        │   │   └── UuidProperty.py
        │   ├── ValueObjects/
        │   │   ├── __init__.py
        │   │   └── BookId.py
        │   └── __init__.py
        └── infrastructure

На src/Book/domain/Book.py у меня есть:

from Shared.domain.ValueObjects.BookId import BookId


class Book:
    bookId: BookId
    pages: int

Как я видел в других ответах (довольно старых), это можно исправить, добавив эти папки в PYTHONPATH или PATH, как sys.path.insert(*path to file*), но мне интересно, есть ли более питонический способ достичь этого.

Я также пытался добавить файл __init__.py в src и импортировать как from src.Shared.domain.ValueObjects.BookId import BookId, но ни одна из предыдущих попыток не сработала для меня

В других репозиториях я видел, что они используют setuptools для установки пакета src, чтобы импортировать его в модульные тесты (я не могу импортировать их в тесты), но я не знаю, рекомендуется ли это или будет работать внутри импорта пакетов

На случай, если кто-то столкнулся с той же проблемой, что и я, мне удалось импортировать подпакеты и полный пакет в каталог tests.

Просто включите в каждый подпакет файл __init__.py, а внутри пакета/подпакетов используйте относительные импорты (это теряет семантику импорта, когда мы знаем, откуда приходит каждый импорт по абсолютному пути от корневого каталога, но работает)

from ..Properties import UuidProperty

# inside __init__.py of Properties directory

from .UuidProperty import UuidProperty

И, включив __init__.py внутрь src/, мы могли бы импортировать их в каталог тестов, как

from src.Book.domain import Book

Надеюсь, это кому-нибудь поможет!

Вернуться на верх