Текущее состояние пакетов пространства имен Python
Я хотел бы иметь несколько подмодулей Python внутри основного модуля, но я хочу распространять их как отдельные пакеты Python. Таким образом, пакет A должен предоставлять my_data.source_a, пакет B должен предоставлять my_data.source_b,... и так далее.
Я обнаружил, что для этого мне нужно использовать пакет пространства имен, но, пытаясь выяснить детали, я обнаружил несколько PEP, охватывающих эту проблему. PEP 420, кажется, является самым последним, который основан на PEP 402 и PEP 382.
Для меня не ясно, каков статус различных PEP и реализаций. Итак, мой вопрос: http://pythonhosted.org/distribute/setuptools.html все еще в порядке или как мне собрать пакет пространства имен?
1 ответ
Для Python 3.3+ PEP 420 - неявные пакеты пространства имен - это путь.
Просто удалите __init__.py из обоих пакетов и добавьте
setup(
...
namespace_packages=['package_name']
...
)
в setup.py. Смотрите пример здесь.
Последняя версия Python, то есть Python 3.7, использует собственный подход к пакетам пространств имен для создания пакетов пространств имен, которые определены в PEP 420.
В настоящее время существует три разных подхода к созданию пакетов пространств имен:
- Используйте собственные пакеты пространства имен. Этот тип пакета пространства имен определен в PEP 420 и доступен в Python 3.3 и новее. Это рекомендуется, если пакеты в вашем пространстве имен когда-либо нуждаются только в поддержке Python 3 и установке через
pip
. - Используйте пакеты пространства имен в стиле pkgutil. Это рекомендуется для новых пакетов, которые должны поддерживать Python 2 и 3 и установку через оба
pip
а такжеpython setup.py install
. - Используйте пакеты пространства имен в стиле pkg_resources. Этот метод рекомендуется, если вам нужна совместимость с пакетами, уже использующими этот метод, или если ваш пакет должен быть защищенным от архивирования.