2015-08-21 33 views
5

假設您有一個名爲Ninja的大型(python)軟件項目。該項目有幾個部分,如服務器客戶端,而且還包含一個通用的基礎結構庫,其中包含常用的類和工具。當然,我會創建一個像這樣的包裹結構:ninja.core,ninja.serverninja.client,其中服務器客戶端以某種方式導入ninja.core。爲發展宗旨(我們使用Eclipse與Subversion)的核心服務器客戶保持在不同的項目,從而導致在一個文件夾結構是這樣的:不同項目的python庫如何處於同一個包中?

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
. 
. 
. 

有一個Java的背景我假設這將是可能的,但事實證明(讀取:導入錯誤),這是行不通的。正如this answer指出的那樣,它通常是不可能有兩個ninja.coreninja.client除非它們是相同的包ninja,其中它們不是子包。這樣就產生了:

解決方法A:

  • 放在一個單一的Eclipse/SVN項目整個代碼和只有一個 包ninja與根據子包。

在生產環境中,我們希望能夠安裝核心服務器但不客戶核心客戶但不服務器。我可能會誤解,但據我瞭解python包,這是不可能的方法A.保持項目分開但兼容,使用包名稱爲ninja_core,ninja_clientninja_server,它似乎是有用的事實上解決了進口問題,並使開發設置中的一切順利運行。爲了滿足能夠安裝服務器客戶獨立的要求,我想出的主意:

方法B:

  • 創建一個名爲忍者新的項目,包含軟件包ninja
  • 讓的ninja導入其他庫(如果安裝的話),看起來是在之內。

我還沒有得到這個工作到目前爲止,我認爲它可能不可能。我在想這樣的事情:

# __init__.py of ninja 
import ninja_core as core 
# or this: 
from ninja_core import core 
# or this: 
import ninja_core.core 

我試過這些,又得到了導入錯誤。在google搜索結合python軟件包的方法並沒有找到與我的問題相關的任何東西之後,我來到了這裏。

我在想,也許整件事都是設計錯誤。應該客戶端服務器即使它們可以獨立安裝在同一個包中?想要獨立安裝客戶端和服務器是不是一個好主意?爲什麼我可以在java中使用擴展包,但是不能在python中使用?這背後的想法是什麼?

TL;博士

我開發的忍者圖書館,用戶應該能夠做到import ninja.clientimport ninja.server。需要分別爲客戶端服務器安裝庫。如何實現這一目標?

回答

3

如果您將頂層命名空間ninja清空,則此操作已在Python 3.3及更高版本中本機支持,請參閱PEP 420;所有你需要做的就是創建ninja目錄和離開了__init__.py文件在該目錄中

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
|  | 
|  >-__init__.py 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
|  | 
|  >-__init__.py 

ninja目錄保持爲空除了孩子coreclient目錄。那些目錄__init__.py文件。

在早期的Python版本中,您可以使用setuptools namespace packages添加對命名空間的支持。 Zope和Plone項目多年來一直使用setuptools發佈命名空​​間包。

其基本原理是確保您的項目是包含setup.py文件的包,並且安裝在development mode或作爲最終產品安裝。你ninja目錄然後有一個__init__.py文件,但這些必須只包含以下行:

__import__('pkg_resources').declare_namespace(__name__) 

setup.py文件爲每個項目必須聲明命名空間:

setup(
    # ... 
    namespace_packages = ['ninja'] 
) 
+0

它的工作原理,但由於'ninja'文件夾中不包含'__init __。py',eclipse不能識別任何子文件夾是軟件包。有沒有一個選項或簡單的解決方法呢? – nfs

+0

對不起,不知道;我自己不使用Eclipse或PyDev;一個快速的谷歌顯示其他人抱怨,但我沒有看到任何簡單的修復你。 –

相關問題