在导入 pkg_resources 之前,无法从同一命名空间树中的包导入
Cannot import from package in same namespace tree until pkg_resources has been imported
我有一个奇怪的问题,我无法单独重现,但它出现在生产代码中,当然生产代码不能公开共享。
为了论证,我有两个包,ns.server
和 ns.protobuf
,其中后者为项目实现了 protobuf 特定扩展。两个包都在 setup.py 中正确声明了名称空间包,并且在 __init__.py
:
中都有样板文件 pkg_resources
try:
__import__('pkg_resources').declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
现在由于一些奇怪的原因,我明白了:
>>> import ns.protobuf
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named protobuf
>>> import pkg_resources
>>> import ns.protobuf
>>>
因此,在我导入 pkg_resources 之前,我的命名空间似乎都出现了问题,然后它就被修复了。还不错,解决方法是首先简单地导入 pkg_resources 。我只是想了解发生了什么。
呃,第二个问题我在这么多天里自己回答了。我在 lib/python2.7/site-packages
中有一个陈旧的 egg-info 目录,来自之前的安装,我不小心忽略了将 -e(开发模式)传递给 pip。完全清除所有内容并重新安装修复它。
我有一个奇怪的问题,我无法单独重现,但它出现在生产代码中,当然生产代码不能公开共享。
为了论证,我有两个包,ns.server
和 ns.protobuf
,其中后者为项目实现了 protobuf 特定扩展。两个包都在 setup.py 中正确声明了名称空间包,并且在 __init__.py
:
try:
__import__('pkg_resources').declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
现在由于一些奇怪的原因,我明白了:
>>> import ns.protobuf
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named protobuf
>>> import pkg_resources
>>> import ns.protobuf
>>>
因此,在我导入 pkg_resources 之前,我的命名空间似乎都出现了问题,然后它就被修复了。还不错,解决方法是首先简单地导入 pkg_resources 。我只是想了解发生了什么。
呃,第二个问题我在这么多天里自己回答了。我在 lib/python2.7/site-packages
中有一个陈旧的 egg-info 目录,来自之前的安装,我不小心忽略了将 -e(开发模式)传递给 pip。完全清除所有内容并重新安装修复它。