2012-09-20 36 views
3

我是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包实现的限制吗?

+0

可能重复[如何在Python中创建命名空间包?](http://stackoverflow.com/questions/6568223/how-to-create-namespace-packages-in-python) –

回答

2

是的,他们可以,但你需要把代码一块特殊的rewind/__init__.py文件中的每个包申报其命名空间:

__import__('pkg_resources').declare_namespace(__name__) 

,你需要声明的每个包的setup.py命名空间元数据:

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

所有这一切都需要你用setuptools,它不会与单纯的distutils发行工作。

查看setuptoolsNamespace packages文件。

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

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

declare_namespace()功能现在负责同样的工作的更简洁。

+0

太棒了!非常感谢! – Ztyx

+0

出于好奇,如果您有一个名称空间包并将代码添加到倒带/ __ init__.py中。两者都会被执行?其中之一被执行?或者他们都不是? – Ztyx

+0

哦,我可以回答我自己的问题;他们都不是。它在这里说:http://packages.python.org/distribute/setuptools.html#namespace-packages – Ztyx

相关问题