Python 2&

Python 2 & 3 compatible namespace modules (using pip)

如何构建多个共享同一名称空间的Python模块,使之与Python 2.7+和3.3+兼容?

让我们调用名称空间test。现在我想要两个独立的模块,叫做test.foo,另一个叫做test.bar。不过,我目前正在开发test.helloworld,它依赖于test.footest.bar。两者都列在requirements.txt文件中。

模块test.footest.bar目前正在对命名空间包使用python 2解决方案:

1
2
import pkg_resources
pkg_resources.declare_namespace(__name__)

当导入test.footest.bar时,运行开发模式pip install -e .的建议pip命令变成:ImportError: No module named 'test.helloworld'

名称空间包的python 3解决方案是隐式名称空间包,其中名称空间包没有__init__.py文件。遗憾的是,这不适用于Python2版本。

我如何为python 2和3设计一个解决方案(允许我使用pip install -e .)?--egg解决方案对我不起作用,因为它已经被否决了。


您应该使用pkgutil风格的名称空间包。

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

pkgutil-style namespace packages

Python 2.3 introduced the pkgutil module and the extend_path function. This can be used to declare namespace packages that need to be compatible with both Python 2.3+ and Python 3. This is the recommended approach for the highest level of compatibility.

列出处理命名空间包的所有可能方法以及哪些方法可以协同工作的表:https://github.com/pypa/sample-namespace-packages/blob/master/table.md


我最近遇到了一个类似的问题,我必须为python 2和3安装一个包。我最终不得不从Github下载代码,然后通过调用

sudo python setup.py install

sudo python3 setup.py install

这将导致为python 2和3安装包,即使代码本身是针对python2的。这允许我使用包,无论是使用python 2还是3,都不会发生任何名称空间冲突。


有关在Python2和3上都可以使用的完整说明,请参见类似问题的答案。

简而言之,除了__init__.py声明在namespace_packages设置的命名空间之外,setup.py还需要为每个模块具有唯一的名称和通用的namespace_packages定义。

如果您仍然有问题,请为每个模块发布您的setup.py__init__.py