使用 PEP420 命名空间包(没有 __init__.py 的包)时,setup.py 中的 namespace_packages 参数的用途是什么?
我玩了一下,发现无论我是否声明了命名空间包,没有区别。 “setup.py install”和“pip install”。无论如何都有效。
我正在构建一个自动 setup.py 代码生成器,如果没有必要,我很乐意不处理这个问题。
只要你:
importlib2
依赖项的 Python 3.3 及更新版本或 Python 2.7(Python 2 的 importlib
向后移植),setuptools
进行打包(我认为应该是28.8或更高版本)pip
版本进行安装(9.0及更高版本就可以了,8.1.2可能也可以工作,但你应该自己测试一下),为了安全起见,您可以放心地在设置脚本中省略
namespace_packages
关键字参数。
GitHub 上有一个名为 sample-namespace-packages
的PyPA 官方存储库,其中包含针对已安装的发行版的不同可能场景的测试套件,其中包含各种名称空间包。如您所见,使用隐式名称空间包的示例包在其设置脚本中不使用
namespace_packages
arg(这里是其中一个脚本),并且 pep420
和 cross_pep420_pkgutil
类型的所有测试都通过在 Python 3 上;这是完整的结果表。
命名空间包是安装在一个顶级名称下的单独包。
通常两个不同的包(例如SQLObject和Cheetah3)安装两个(或更多)不同的顶级包(在我的示例中为
sqlobject
和Cheetah
)。
但是,如果我有一个库,我想将其分成几个部分并允许安装这些部分而不需要库的其余部分,该怎么办?我使用命名空间包。示例:这两个包是一个库的 2 个部分:m_lib 和 m_lib.defenc。一个安装可以单独使用的
m_lib/defenc.py
,另一个安装 m_lib
库的其余部分。要立即安装整个库,我还提供了 m_lib.full。
PS。所有提到的包都是我的。源代码在 Github 或 我的个人 git 托管 提供。