打包常见的Python命名空间

16
我计划在接下来的几天里将自己编写的库打包并上传到PyPI,但我对命名空间的处理方法有些不确定。
我的一些项目之前无关联,但采用了相似的方法,我想给它们都分配同一个命名空间。例如:
Library 1 命名空间:abc.seo Library 2 命名空间:abc.ajax Library 3 命名空间:abc.ecommerce 等等
问题是,我不确定两个独立的包(比如egg文件)是否可以共存于同一个父命名空间中。这种方法是否有问题,或者有没有解决方法?最佳的处理方法是什么?
这些库不应该被打包在一起,因为它们太不相关了。在发布“正式”版本之前,我希望在上传之前就把它搞清楚,以避免痛苦的命名空间更改。
(注:abc不是真实名称,我只是为了避免广告而这样命名。)
更新:
出于对未安装setuptools的用户的考虑,我选择了以下方式:
try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)

setup.py 中使用以下内容:

setup(
    ...
    namespace_packages = ['rollyourown'],
    ...

1
你看过PyPi上各种eGenix mx包了吗?可以看看它们的例子。然后,你可以基于那个模式提出更加具体的问题。 - S.Lott
那么你的意思是说,用户安装两个具有相同父命名空间的独立包并不会有问题?这永远不会引起任何问题吗?mx包似乎有一个非常复杂的安装过程,我会尽力看看它们是否有任何特殊的命名空间问题解决方法。 - Will Hardy
1
你的“更新”实际上是一个答案,而不是你问题的更新。我会将其移动为答案,这样我们就可以对其进行投票 :) - bukzor
1个回答

16
在每个项目的根目录中,创建以下结构:
/setup.py
/abc/__init__.py
/abc/seo/

/abc/__init__.py 包含:

__import__('pkg_resources').declare_namespace(__name__)

setup.py 包含:

setup(...,
    packages: ['abc', 'abc.seo'],
    namespace_packages = ['abc']
    ...
)

参考文档:命名空间包支持。


太棒了!这听起来完全解决了技术问题。谢谢! - Will Hardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接