pep 420 цель namespace_packages в setup.py

Какова цель аргумента namespace_packages в setup.py при работе с пакетами пространства имен PEP420 (без __init__.py)?

Я поиграл с ним и не увидел никакой разницы, объявлял ли я пакеты пространства имен или нет. «setup.py install» и «pip install». сработало в любом случае.

Я создаю автоматический генератор кода setup.py и был бы рад не заниматься этим, если в этом нет необходимости.


person Lior Cohen    schedule 10.05.2018    source источник


Ответы (2)


До тех пор, как вы:

  • стремиться к Python 3.3 и новее или Python 2.7 с установленной зависимостью importlib2 (бэкпорт importlib для Python 2),
  • используйте последнюю версию setuptools для упаковки (я думаю, она должна быть 28.8 или новее)
  • и используйте последнюю версию pip для установки (подойдет 9.0 и новее, 8.1.2, вероятно, также будет работать, но вы должны проверить это самостоятельно),

вы в безопасности и можете безопасно опустить ключевое слово namespace_packages arg в своих сценариях установки.

Существует официальный репозиторий PyPA под названием sample-namespace-packages на GitHub, который содержит набор тестов для различных возможные сценарии установленных дистрибутивов, содержащих пакеты пространств имен каждого типа. Как видите, примеры пакетов, использующие неявные пакеты пространства имен, не используют аргумент namespace_packages в своих сценариях установки (вот один из скриптов) и все тесты типов pep420 и cross_pep420_pkgutil проходят на Python 3; вот полная таблица результатов.

person hoefling    schedule 11.05.2018

Пакеты пространства имен — это отдельные пакеты, которые устанавливаются под одним именем верхнего уровня.

Обычно это два разных пакета (например, SQLObject и Cheetah3) установить два (или более) разных пакета верхнего уровня (в моих примерах sqlobject и Cheetah).

Но что, если у меня есть библиотека, которую я хочу разбить на части и разрешить установку этих частей без остальной библиотеки? Я использую пакеты пространства имен. Пример: эти два пакета являются двумя частями одной библиотеки: m_lib и m_lib.defenc. Один устанавливает m_lib/defenc.py, который можно использовать отдельно, другой устанавливает остальную часть библиотеки m_lib. Чтобы сразу установить всю библиотеку, я также предоставляю m_lib.full.

PS. Все упомянутые пакеты мои. Исходный код предоставляется на Github или мой личный git-хостинг.

person phd    schedule 10.05.2018
comment
Это ничего не говорит об аргументе namespace_packages в setup.py. - person user2357112 supports Monica; 12.05.2018
comment
Все 3 пакета m_lib используют namespace_packages = ["m_lib"] в setup.py, потому что m_lib — это имя пакета верхнего уровня для всех частей библиотеки. - person phd; 12.05.2018
comment
Но что произойдет, если вы не объявите namespace_packages=["m_lib"]? - person Lior Cohen; 12.05.2018
comment
Вторая установка (pip install m_lib) переопределит первую (pip install m_lib.defenc) вместо добавления части библиотеки. - person phd; 12.05.2018