Иногда большие пакеты очень полезно распределять как коллекцию более мелких пакетов egg. Однако, Python не позволяет нормальным способом получать содержимое пакета из нескольких мест. “Пакеты пространства имен” - решение этой проблемы. Когда вы говорите, что пакет является пакетом пространства имен, это означает, что пакет фактически не имеет содержимого в его __init__.py, и что он просто контейнер для модулей и подпакетов.
В последствии во время работы pkg_resources автоматически определит, что содержимое пакета пространства имен распределено на несколько пакетов egg или каталогов и скомбинирует их в один “виртуальный” пакет.
Аргумент namespace_packages функции setup() позволяет задать пакеты пространства имен ваших проектов и они будут включены в метаданные этих проектов. Аргументу должен быть присвоен список пакетов пространств имен в которых задействован egg пакет.
-
setup(
-
# …
-
namespace_packages = ['zope']
-
)
т.к. он содержит пакет zope.interface, находящийся в пакете пространства имен zope. Аналогично, проект для независимого zope.publisher будет также содержать объявление пакета пространства имен zope. Когда эти проекты будут установлены и начнут использоваться, Python увидит их как часть “виртуального” пакета zope, даже если они были установлены в разные места.
Пакеты пространства имен не могут быть пакетами верхнего уровня. Например, пакет zope.app для Zope 3 является пакетом пространства имен и в будущем пакет peak.util из PEAK тоже.
Заметьте, между прочим, дерево исходников ваших проектов должно включать файлы пакетов пространства имен __init__.py (аналогично для всех родительских пакетов) согласно стандартному формату пакетов Python. Эти файлы __init__.py должны содержать следующие строки:
-
-
__import__('pkg_resources').declare_namespace(__name__)
Этот код гарантирует, что будет задействован механизм пакета пространства имен и текущий пакет будет зарегистрирован как пакет пространства имен.
Вы НЕ должны добавлять какой-либо другой код и данные в файл __init__.py пакетов пространства имен. Даже если он работает в процессе разработки или при установке проектов в виде .egg файлов, но это не будет работать, когда проекты будут установлены с использованием “системного” инструментария компоновки — в этих случаях файлы __init__.py не будут установлены, не говоря уже об их выполнении.
Вы должны включить строку declare_namespace() в файл the __init__.py каждого проекта, который содержит искомый пакет пространства имен, чтобы гарантировать объявление пространства имен будет независимо от того, какой из файлов __init__.py проектов будет загружен первым. Если первый загруженный файл __init__.py не содержит объявления, то оно уже не будет сделано никогда, т.к. другой уже не будет загружен!
Примечание:
Setuptools 0.6a для вас автоматически в процессе выполнения вызывает declare_namespace(), но версия 0.7a не будет делать это. Т.к. функция автоматического объявления имеет ряд негативных побочных эффектов, таких, как необходимость импорта всех пакетов пространства имен во время установки pkg_resources, а также необходимость явного импортирования pkg_resources перед тем, как любой из пакетов пространства имен начнет работать. Начиная с версии 0.7a, вы будете сами заботиться о включении строк объявления, и функция автоматического объявления будет отключена, это позволит избавиться от негативных побочных эффектов.
В течение оставшегося времени разработки использщуя 0.6 версию, setuptools будет предупреждать вас о пропущенных вызовах declare_namespace() в ваших файлах __init__.py, и вы должны поправить их как можно скорее, до того, как выйдет setuptools 0.7a1. Пространство имен пакетов без строк объявления будет работать не правильно как только вы обновитесь до setuptools 0.7a1, поэтому важно, чтобы вы сделали эти изменения сейчас и избежали отказа работоспособности вашего кода.
17 Апрель 2009
Плохой перевод.
Если честно, ничего не понял :-), хотя приблуда выглядит полезной. Собственно, я вот-вот начал осознанно использовать setuptools, да и просто setup.py. Разработал свою хитрую команду - механизм создания виндового дистрибутива, сложно, но интересно :-).
Почему не покоцаешь этих ботов?
..bw
7 Май 2009
Ну хз, если где что непонятно, предложи свою версию перевода или укажи на ошибки
А на ботов просто нет времени, сейчас стоит капча, больше они сюда не попадают. Вообще смотри в сторону более высокоуровневого инструментария buildout - мощный и полезная вещь.