假設我對我的僱主寫兩個應用程序,我們會打電話給他們應用1和應用2。這些應用程序依賴於一些包含兩者所需代碼的包。假設App1取決於包A和包B。 App2取決於包裝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不會在父目錄中搜索要導入的包。
我知道一些選項可以做到這一點,但它們都顯得有點難看。我之前使用過的一種策略是將主文件App1和App2放入「repo_root」目錄中。然後這兩個主文件可以毫無問題地導入這些包。另一個選擇是使用sys.path.append和文件來確定父目錄是什麼並將其添加到Python搜索模塊的路徑中。
有乾淨,優雅的方式來做這樣的事情嗎?謝謝你的幫助。
更新:雖然virtualenv解決方案在處理包和依賴關係方面可以提供很大的幫助,但對於可以通過相對導入來解決的問題來說,這看起來似乎有些過火了。然而,進行相對進口似乎非常複雜。有PEP 366,但這是相當複雜的,並且可能不允許導入包之外。我花了一些時間看importlib,但我敢肯定,不允許導入包外。很多人似乎都使用了sys.path,其中this似乎是我找到的最好的例子。但是,正如我所提到的,這似乎是一種相當不方便的做事方式。我花了幾乎整整的時間來研究這個問題,我不認爲有答案。如果我錯了,請糾正我,但我現在認爲,沒有像virtualenv和一些.pth文件那樣引入沉重的打擊手,就沒有乾淨而且不危險的方式來進行相對導入。無論如何,再次感謝您的幫助。因爲virtualenv是唯一的選擇,我會將其標記爲已回答。
我一直在閱讀和觀看一些截屏視頻,我想我已經明白了。我可以爲App1和App2創建一個virtualenv引導腳本,以便安裝所需的開源庫以及'。pth'文件(必須放置在'site-packages'文件夾中)。結帳後,運行引導程序將創建允許應用程序運行的環境。對於部署,我可以使用相同的引導來設置生產服務器?這是否正確? – bnsmith 2010-07-06 16:40:44
非常。在virtualenv中開發的巨大好處是確切知道部署要求是什麼,並且在virtualenv中進行部署是一個必須考慮的選項。 – mavnn 2010-07-07 08:08:12