Python setuptools: __init__.py не вызывает declare_namespace()

#python #setuptools #zope #zodb #namespace-package

#python #setuptools #zope #zodb #пространство имен-пакет

Вопрос:

Я пытаюсь установить пакет zope2.zodbbrowser 0.2 (https://pypi.python.org/pypi/zope2.zodbbrowser/0.2 ). Сценарий установки завершается ошибкой со следующей ошибкой:

 Namespace package problem: zope2 is a namespace package, but its
__init__.py does not call declare_namespace()! Please fix it.
(See the setuptools manual under "Namespace Packages" for details.)
 

Соответствующий раздел в руководстве, похоже, здесь: https://pythonhosted.org/setuptools/setuptools.html#namespace-packages

Однако я не знаком с внутренними настройками setuptools, и я не смог решить проблему с помощью руководства. Как я могу решить эту проблему с пространством имен, чтобы успешно установить пакет?

Для справки, исходный код ~/zodbbrowser/src/zope2.zodbbrowser/zope2/__ init__.py является:

 # this is a namespace package
try:
    import pkg_resources
    pkg_resources.declare_namespace(__name__)
except ImportError:
    import pkgutil
    __path__ = pkgutil.extend_path(__path__, __name__)
 

Комментарии:

1. вы пробовали устанавливать с помощью pip? Используете ли вы python2.6?

2. Да, я пробовал pip, но он говорит, что требования уже обновлены (без фактической установки пакета). Я использую python 2.7.

3. Этот пакет предназначен для python 2.6. какую ОС вы используете?

4. Есть ли какая-либо возможность запустить его под python 2.7? Моя ОС — Ubuntu 12.04.4 LTS.

5. здесь есть более новый пакет pypi.python.org/pypi/zodbbrowser . Похоже, вам уже нужно установить pip, убедитесь, что вы используете правильный pip для python2.7

Ответ №1:

В сообщении об ошибке говорится, что вам нужно использовать declare_namespace() функцию, поэтому, похоже, возможно заставить ее работать таким образом.

Но вам, вероятно, следует использовать неявный пакет пространства имен и __init__.py полностью удалить его. Пакеты пространства имен обычно не имеют его, потому что они могут конфликтовать __init__.py с другим пакетом пространства имен с той же древовидностью.

Например, если у вас есть zope2.a пространство имен:

 zope2/__ init__.py
zope2/a/__init__.py
 

И zope2.b пространство имен:

 zope2/__ init__.py
zope2/b/__init__.py
 

Результат после установки двух будет:

 zope2/__ init__.py <= Setuptools cannot know which file to take
zope2/a/__init__.py
zope2/b/__init__.py
 

Смотрите документацию по Python:

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

https://packaging.python.org/guides/packaging-namespace-packages/