Обычно это используется с pkgutil для размещения пакета на диске.Например, zope.interface и zope.schema являются отдельными дистрибутивами (zope
- это «пакет пространства имен»).Возможно, вы установили zope.interface в /usr/lib/python2.6/site-packages/zope/interface/
, тогда как вы используете zope.schema более локально в /home/me/src/myproject/lib/python2.6/site-packages/zope/schema
.
Если вы поставите pkgutil.extend_path(__path__, __name__)
в /usr/lib/python2.6/site-packages/zope/__init__.py
, тогда и zope.interface, и zope.схема будет импортирована, потому что pkgutil будет иметь изменение __path__
на ['/usr/lib/python2.6/site-packages/zope', '/home/me/src/myproject/lib/python2.6/site-packages/zope']
.
pkg_resources.declare_namespace
(часть Setuptools) похоже на pkgutil.extend_path
, но больше осведомлено о почтовых индексах на пути.
Ручное изменение __path__
является редкостью и, вероятно, не является обязательным, хотя полезно смотреть на переменную при отладке проблем импорта с пакетами пространств имен.
Вы также можете использовать __path__
для обезьяньего патчаНапример, иногда я запускал distutils с обезьяньим патчем, создавая файл distutils/__init__.py
, который ранний sys.path
:
import os
stdlib_dir = os.path.dirname(os.__file__)
real_distutils_path = os.path.join(stdlib_dir, 'distutils')
__path__.append(real_distutils_path)
execfile(os.path.join(real_distutils_path, '__init__.py'))
# and then apply some monkeypatching here...