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.footest.bar。两者都列在requirements.txt 文件中。

test.footest.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.footest.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)的主要内容,如果未能解决你的问题,请参考以下文章

Python()-类命名空间和对象/实例命名空间

基本 Python 面试问题

C++入门1-基础语法

C++入门1-基础语法

[Python] 命名空间&作用域

我的模特有什么问题?无法找到[EmailAddress]命名空间?