2012-09-20 41 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

相關問題