两个发行版可以提供相同的包吗?

时间:2012-09-20 07:36:23

标签: python

我是PyPi package (or distribution, whatever) called "rewind"的作者。它附带一个名为rewind的(根)包。

目前,rewind包中包含服务器和客户端代码。但是,我正在考虑将代码拆分为两个单独的PyPi包。一次发送,一个rewind.server包,另一个发送rewind.client

我的问题是,两个单独的PyPi包可以提供相同的(根)包,rewind吗?

我到目前为止所做的测试似乎告诉我这是不可能的。我的测试创建了两个前置于PYTHONPATH的文件夹。这两个文件夹都包含Python包“mytestpackage”。第一个“mytestpackage”包含模块“a”,第二个包含模块“b”。我只能导入模块“a”或“b”。不是两个。

如果有可能的话,我很想听听Pythonistas的发言人。或者,这是当前Python包实现的限制吗?

1 个答案:

答案 0 :(得分:2)

是的,他们可以,但你需要在每个包的rewind/__init__.py文件中放一段特殊的代码来声明它是一个命名空间:

__import__('pkg_resources').declare_namespace(__name__)

并且您需要在每个包的setup.py元数据中声明命名空间:

setup(
    # ...
    namespace_packages  = ["rewind"]
)

所有这些都要求您使用setuptools,它不适用于仅仅是distutils发行版。

请参阅setuptools的{​​{3}}文档。

注意:较旧的包使用了更详细的命名空间声明代码版本:

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

declare_namespace()函数现在可以更简洁地处理相同的工作。