2013-06-18 51 views
18

我正在努力將Python作爲我團隊開發工具套件的一部分。通過我們使用的其他語言/工具,我們開發了許多專門針對我們所做工作的可重用函數和類。這標準化了我們做事的方式並節省了大量的車輪重新制造。在Python開發中使用共享模塊的正確方法是什麼?

我似乎無法找到任何有關如何通常用Python處理的例子。現在我在本地驅動器上有一個開發文件夾,下面有多個項目文件夾,還有一個包含帶有可重用類和函數的包和模塊的「通用」文件夾。這些「通用」模塊由多個項目中的模塊導入。

Development/ 
    Common/ 
     Package_a/ 
     Package_b/ 
    Project1/ 
     Package1_1/ 
     Package1_2/ 
    Project2/ 
     Package2_1/ 
     Package2_2/ 

在努力學習如何分發Python應用程序,它似乎有一個假設,即所有引用的包都低於頂級項目文件夾,而不是抵押給它。我想到也許正確的做法是在單獨的項目中開發通用/框架模塊,並且一旦測試,通過安裝到站點包文件夾將它們部署到每個開發人員的環境。但是,這也提出了重新分配的問題。

任何人都可以闡明這一點,或指向我討論這個問題的資源?

+0

看看'sys.path' –

+1

你想如何將包提交給python程序? Package_a - Package2_1是否所有頂級軟件包,還是您嘗試執行一些命名空間/層次結構? –

+0

嗯......不知道你是什麼意思的「頂級」包。對於「Common」下的軟件包,它們是區分標準庫擴展和/或標準庫類的包裝器和裝飾器的類和函數以及「企業」特定的類和函數的一種方式,即提供特定於我們的環境的可重用功能。每個軟件包內都有多個模塊,用於進一步組織這些名稱空間內的可重用例程。不知道我是否回答這個問題。 –

回答

2

我認爲這是創建分發Python包的最佳參考:

鏈接刪除,因爲它導致了黑客入侵的網站。

另外,不要覺得你需要將所有東西都嵌套在一個目錄下。你可以做這樣的事情

platform/ 
    core/ 
     coremodule 
    api/ 
     apimodule 

,然後做這樣的事情from platform.core import coremodule

5

必讀,首先對這種東西是在這裏:

What is the best project structure for a Python application?

的情況下,你還沒有看到它(並在第二個答案中按照鏈接)。

關鍵是每個主要軟件包都可以導入,就好像「。」一樣。是頂級目錄,這意味着它將在安裝在網站包中時也能正常工作。什麼這意味着是主要軟件包都應該是頂級目錄內的平板,如:

myproject-0.1/ 
    myproject/ 
     framework/ 
    packageA/ 
     sub_package_in_A/ 
      module.py 
    packageB/ 
     ... 

然後,兩個你(你的其他包內)和您的用戶可以導入爲:

import myproject 
import packageA.sub_package_in_A.module 

這意味着您應該認真考慮@ MattAnderson的評論,但是如果您希望它看起來是一個單獨分發的軟件包,它需要位於頂層目錄中。

注意這並沒有做一個阻止您(或您的用戶):

import packageA.sub_package_in_A as sub_package_in_A 

但它確實從允許阻止你:

import sub_package_in_A 

直接。

+0

該鏈接的良好討論。謝謝。 –

1

...似乎有一個假設,所有引用的軟件包 低於頂級項目文件夾,而不是抵押品。

這主要是因爲當前工作目錄默認爲sys.path中的第一項,這使得在該目錄下導入模塊和包非常方便。

如果你刪除它,你甚至無法從當前工作目錄中導入的東西...

$ touch foo.py 
$ python 
>>> import sys 
>>> del sys.path[0] 
>>> import foo 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named foo 

也發生,我認爲也許是正確的做法是 制定共同的思想/框架模塊在一個單獨的項目中,並且一旦測試 ,通過安裝到 site-packages文件夾將這些模塊部署到每個開發人員的環境。

這對於開發並不是真正的主要問題。如果您使用的是版本控制,並且所有開發人員都使用相同的結構檢查源代碼樹,那麼您可以輕鬆使用relative path hacks以確保代碼正常工作,而不必混亂環境變量或符號鏈接。

但是,這也引發了問題重新分配。

這是事情會變得更加複雜的地方,但前提是您打算獨立於使用它們的項目發佈庫,並且/或者讓多個項目安裝程序共享相同的庫。情況就是如此,請看distutils

如果不是,您可以簡單地使用開發中使用的相同路徑hack,以確保您的項目「開箱即用」。

+0

不 - 不打算在我們團隊之外發布圖書館。 –

3

如果您有要共享多個項目的通用代碼,可能需要考慮將此代碼存儲在物理上分離的項目中,然後將其作爲依賴項導入到其他項目中。如果您將通用代碼項目託管在github或bitbucket中,可以使用pip將其安裝在任何其他項目中,這很容易實現。這種方法不僅可以幫助您輕鬆地在多個項目中共享通用代碼,還可以幫助您防止無意中創建不良依賴(即從通用代碼指向非通用代碼的那些依賴)。

下面的鏈接提供了一個很好的介紹,使用pip和virtualenv來管理依賴關係,如果你和你的團隊對於python是相當新的,這是一個非常常見的工具鏈, :

http://dabapps.com/blog/introduction-to-pip-and-virtualenv-python/

下面的鏈接並顯示您如何從GitHub依賴使用PIP拉:

How to use Python Pip install software, to pull packages from Github?

+0

謝謝 - 我需要查看源代碼/版本控制系統,這可能會殺死兩隻鳥... –

+0

沒問題 - 即使您不需要去源代碼控制,virtualenv和pip也會被推薦。祝你好運 – robjohncox

+0

>>作爲依賴項導入到其他項目中<<實際上,這就是我目前正在做的事情,它在IDE中正常工作,但是分發使用公共代碼的應用程序是我所厭煩的。 –

相關問題