安装包窃取命名空间

时间:2015-03-18 19:33:37

标签: python namespaces package

我正在开发一个软件包" jw.data"在Python 2.7.9中,命名空间为 jw ,包中包含 data 。我已经放了规范

try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
jw/__init__.py中的

。当我运行./setup.py develop时(在setup.py中我放了namespace_packages=['jw']),那么我就有了#j;"在jw.data.egg-info/namespace_packages.txt。做一个

import jw.data
import jw.data.model

工作正常。所以我想我已经正确设置了命名空间包。

现在我已经在命名空间 jw 中编写了一个包" jw.util",其中包含 util 。一旦我安装它,导入 jw.data 或其下面的任何内容都会失败:

>>> import jw.data
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named data

卸载 jw.util 后再次运行。

我在其他地方使用了 jw.util ,但还没有在 jw 命名空间中的包中。看起来 jw.util 正在保留 jw 名称空间。

我在另一个命名空间遇到了同样的问题。在那里我注意到setup.py中的包名与命名空间加包相同。我重命名了&#34; namespace.package x &#34;中的所有包。 to&#34; namespace-package x &#34;,令人惊讶的是它起作用了。我尝试使用 jw.util jw.data 进行相同的操作,但这里的技巧并不起作用。而且我真的不相信setup.py中的软件包名称与它包含的软件包层次结构有关,还是有它?

无论如何,任何人都知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

似乎是Python中一个众所周知的错误。

https://github.com/pypa/setuptools/issues/250中有一个解决方案:

简单地说,追加

;import pkg_resources; pkg_resources.fixup_namespace_packages('')

到site-packages中竞争包的 module -nspkg.pth中的单行。分号是必需的。