2010-07-06 42 views
1

假設我對我的僱主寫兩個應用程序,我們會打電話給他們應用1應用2。這些應用程序依賴於一些包含兩者所需代碼的包。假設App1取決於包A包BApp2取決於包裝B包裝C。我認爲自然的組織策略是檢查所有版本控制如下:組織多個Python應用程序和共享庫包

repo_root 
+--- App1 
| +--- App1.py 
| +--- ... and so on 
+--- App2 
| +--- ... files for App2 
+--- PackageA 
| +--- __init__.py 
| +--- ... and more files 
+--- PackageB 
| +--- ... files for PackageB 
+--- PackageC 
    +--- ... files for PackageC 

問題出現在導入包中。例如,應用程序1應用程序2都需要導入包B,但我不能只將「導入PackageB」放入每個這些應用程序的主文件。 Python不會在父目錄中搜索要導入的包。

我知道一些選項可以做到這一點,但它們都顯得有點難看。我之前使用過的一種策略是將主文件App1App2放入「repo_root」目錄中。然後這兩個主文件可以毫無問題地導入這些包。另一個選擇是使用sys.path.append和文件來確定父目錄是什麼並將其添加到Python搜索模塊的路徑中。

有乾淨,優雅的方式來做這樣的事情嗎?謝謝你的幫助。

更新:雖然virtualenv解決方案在處理包和依賴關係方面可以提供很大的幫助,但對於可以通過相對導入來解決的問題來說,這看起來似乎有些過火了。然而,進行相對進口似乎非常複雜。有PEP 366,但這是相當複雜的,並且可能不允許導入包之外。我花了一些時間看importlib,但我敢肯定,不允許導入包外。很多人似乎都使用了sys.path,其中this似乎是我找到的最好的例子。但是,正如我所提到的,這似乎是一種相當不方便的做事方式。我花了幾乎整整的時間來研究這個問題,我不認爲有答案。如果我錯了,請糾正我,但我現在認爲,沒有像virtualenv和一些.pth文件那樣引入沉重的打擊手,就沒有乾淨而且不危險的方式來進行相對導入。無論如何,再次感謝您的幫助。因爲virtualenv是唯一的選擇,我會將其標記爲已回答。

回答

3

您可以使用的一種解決方案是爲每個應用程序分配一個virtualenv,然後使用相對.pth文件指向軟件包。這使你可以很好地控制每個應用程序正在開發的環境,並避免「但我的機器上已經有package_x!」測試中的問題。

+0

我一直在閱讀和觀看一些截屏視頻,我想我已經明白了。我可以爲App1和App2創建一個virtualenv引導腳本,以便安裝所需的開源庫以及'。pth'文件(必須放置在'site-packages'文件夾中)。結帳後,運行引導程序將創建允許應用程序運行的環境。對於部署,我可以使用相同的引導來設置生產服務器?這是否正確? – bnsmith 2010-07-06 16:40:44

+0

非常。在virtualenv中開發的巨大好處是確切知道部署要求是什麼,並且在virtualenv中進行部署是一個必須考慮的選項。 – mavnn 2010-07-07 08:08:12

1

virtualenv是一個乾淨和優雅的方式來處理這些問題。閱讀底漆,然後在pypi上進行總結,然後安裝並試用一下!

相關問題