打包常见的python命名空间

Posted

技术标签:

【中文标题】打包常见的python命名空间【英文标题】:packaging common python namespaces 【发布时间】:2011-07-01 04:47:38 【问题描述】:

我希望在接下来的几天内打包并上传我必须的库到 PyPI,但我有点不确定我对命名空间的方法。

我有一些其他不相关的项目采用类似的方法,并希望为它们提供所有相同的命名空间。例如:

库 1 命名空间:abc.seo 库 2 命名空间:abc.ajax 库 3 命名空间:abc.ecommerce

问题是我不确定两个单独的包(例如eggs)是否可以与同一个父命名空间共存。这种方法有问题吗,还是有办法解决?最好的方法是什么?

这些库不应该打包在一起,它们太不相关了。我想在上传之前把它弄好,以免在“正式”发布后痛苦地更改命名空间。

(NB abc 不是真名,我希望我的问题没有广告)

更新

为了对没有安装 setuptools 的人好一点,我选择了以下方法:

try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)

setup.py:

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

【问题讨论】:

你看过 PyPi 上的各种 eGenix mx 包吗?看看那些例子。然后,您可以根据该模式提出更多具体问题。 所以你的意思是说用户安装两个具有相同父命名空间的单独包没有问题?这永远不会引起任何问题? mx 包的安装过程似乎非常复杂,我会尽力看看他们是否有任何针对命名空间问题的特殊解决方法。 您的“更新”实际上是一个答案,而不是您问题的更新。我会把它作为一个答案,所以我们可以投票:) 【参考方案1】:

在每个项目基目录中,创建如下结构:

/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']
    ...
)

参考文档:namespace packages。

【讨论】:

太棒了!这听起来像是完全解决了技术问题。谢谢!

以上是关于打包常见的python命名空间的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中命名空间的 5 个常见用法

命名空间和作用域

python命名空间的本质

命名空间

Python变量作用域

python命名空间和作用域