Python 2 & 3 兼容的命名空间模块(使用 pip)
Posted
技术标签:
【中文标题】Python 2 & 3 兼容的命名空间模块(使用 pip)【英文标题】:Python 2 & 3 compatible namespace modules (using pip) 【发布时间】:2015-11-02 03:46:07 【问题描述】:如何构建多个 python 模块共享相同的命名空间,兼容 Python 2.7+ 和 3.3+?
让我们调用命名空间test
。现在我想要两个单独的模块,称为test.foo
和另一个称为test.bar
。但是,我目前正在开发test.helloworld
,这取决于test.foo
和test.bar
。两者都列在requirements.txt
文件中。
test.foo
和 test.bar
模块当前正在使用 Python 2 solution 命名空间包:
import pkg_resources
pkg_resources.declare_namespace(__name__)
运行suggested pip-command for development mode pip install -e .
变成:ImportError: No module named 'test.helloworld'
同时导入test.foo
或test.bar
正在工作。
命名空间包的Python 3 solution 是隐式命名空间包,其中命名空间包没有__init__.py
文件。遗憾的是,这不适用于 Python 2 版本。
如何为 Python 2 和 3 设计解决方案(允许我使用pip install -e .
)? --egg
解决方案对我不起作用,因为它已被弃用。
【问题讨论】:
这应该也能解决您的问题***.com/a/7075121/681481 【参考方案1】:我最近遇到了类似的问题,我必须为 Python 2 和 3 安装一个包。我最终不得不从 GitHub 下载代码,然后通过调用运行 setup.py
sudo python setup.py install
和
sudo python3 setup.py install
这会导致为 Python 2 和 3 安装包,即使代码本身是为 Python 2 设计的。这使我无论使用 Python 2 还是 Python 3 都可以使用该包,而不会出现任何命名空间冲突。
【讨论】:
【参考方案2】:你会想要使用 pkgutil 风格的命名空间包。
来自https://packaging.python.org/guides/packaging-namespace-packages/:
pkgutil 风格的命名空间包
Python 2.3 引入了 pkgutil 模块和 extend_path 函数。这可用于声明需要与 Python 2.3+ 和 Python 3 兼容的命名空间包。这是***别兼容性的推荐方法。
一个表格列出了处理命名空间包的所有可能方式,以及哪些方式可以协同工作:https://github.com/pypa/sample-namespace-packages/blob/master/table.md
【讨论】:
【参考方案3】:有关适用于 python 2 和 3 的完整说明,请参阅similar question 的答案。
简而言之,setup.py
需要为每个模块提供唯一 名称和一个通用 namespace_packages
定义,以及__init__.py
声明在@ 设置的命名空间987654325@.
如果您仍有问题,请为每个模块发布您的 setup.py
和 __init__.py
。
【讨论】:
以上是关于Python 2 & 3 兼容的命名空间模块(使用 pip)的主要内容,如果未能解决你的问题,请参考以下文章