Импорт подпакетов проекта в 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
Надеюсь, это кому-нибудь поможет!