Python setuptools: __init__.py 不调用 declare_namespace()
我正在尝试安装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 个回答
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/