Python setup.py определяет необязательные подпакеты с необязательными зависимостями

Я знаю, что можно определить необязательные зависимости в setup.py с extra-require, Теперь я спрашиваю себя, возможно ли также пометить пакеты как необязательные, чтобы вы могли выбрать, какие подпакеты вы хотите установить? Есть ли способ сопоставить необязательные зависимости с необязательными пакетами.

Например, если у меня есть проект под названием проект А и эта структура пакета:

Project
   --subPackage 1
   --subPackage 2
   --subPackage 3

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

Таким образом, ожидаемое поведение для проекта B должно быть следующим:

setup.py для проекта B:

    setup(
    name='Project B',
    version='0.0.0',
    install_requires=["ProjectA"])

в результате устанавливается только Проект 1 с подпакетом 1. Но если я изменю install_requires линия к install_requires=["ProjectA[Subpackage2]"], Проект A устанавливается с подпакетом 1 и 2 с учетом требований к подпакету 1 и 2.

Это там, чтобы создать setup.py для проекта A для архивирования этого поведения?

1 ответ

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

      project-subpackage-a/
    setup.py
    project/
        subpackage_a/
            __init__.py

project-subpackage-b/
    setup.py
    project/
        subpackage_b/
            __init__.py

Здесь у вас есть два совершенно отдельных пакета со своими собственными setup.pyконфигурации. Это означает, что вы можете использовать install_requiresа также extra_requiresтак же, как и с любым другим пакетом.

Однако, в отличие от других пакетов, если вы установите оба пакета с пространством имен отдельно или с помощью требований, они оба могут существовать в одном и том же пространстве имен пакета.

То есть, если вы устанавливаете оба пакета, вы можете затем импортировать их, как если бы они были получены из одного и того же источника:

      from project import subpackage_a
from project import subpackage_b

Для получения дополнительной информации о том, как правильно настроить пакеты пространства имен, ознакомьтесь с документацией по python .

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