2016-04-10 55 views
4

我一直使用Python來處理單個文件的腳本,現在我正在處理我的第一個「複雜」項目,所以我還沒有使用Python(3.x)中的軟件包的經驗。哪個是在複雜的Python項目中處理導入的正確方法?

我知道這是一個經常被問到的問題,但我錯過了一些東西,用於在我的項目中成功組織模塊導入,這應該用作庫。

假設以下項目樹:

myProject/ 
- subpackage1/ 
    - __init__.py 
    - other1.py 
- subpackage2/ 
    - __init__.py 
    - other2.py 
- __init__.py 
- foo.py 
- bar.py 

這是相互導入模塊的正確方法是什麼?特別是:

  1. other1
  2. 導入other1other2
  3. 導入foobar
  4. 導入foo發育過程中導入foo(這是一個庫)從不同的目錄(是虛擬環境中的正確的選擇?)

謝謝!

編輯:(使問題更具體)我明顯地嘗試之前不同的方法。我在一些受歡迎的項目中看到的是使用絕對導入像from myProject.subpackage1.other1 import something。它看起來像一個乾淨的解決方案(類似於我在Java中所做的),但採用這種方法時,由於導入錯誤,我不能簡單地運行我的代碼。可以virtualenv是在嘗試導入它們之前安裝軟件包的解決方案嗎?

回答

2

1.導入foobar

由於the tutorial說,你可以通過導入from .導入從同一目錄模塊。例如:

from . import foo 

如果barpython bar.py執行,那麼你也可以導入它絕對,像任何其他模塊:

import foo 

這工作,因爲執行文件的父目錄添加到模塊搜索路徑(sys.path/PYTHONPATH)。但是,我不會依賴這種行爲,因爲它對於導入的模塊和主模塊意味着不同的東西。

from .. import foo 

3:

2.如果您使用的是相對導入語法,那麼你可以添加其他.意味着父目錄從other1

導入foo。從other2

導入other1這不應該是太大的驚喜現在,但你可以在子包使用與模塊相對導入,太:

from ..subpackage1 import other1 

4.從導入foo(庫)在開發過程中不同的目錄

我假設「不同的目錄」你的意思是「一個不同的項目」。在這種情況下,是的,您想要將foo作爲distutils/setuptools軟件包打包,然後將其安裝到另一個項目的virtualenv中。

準確地說,如何做到這一點是一個已經變得相當長的帖子更多的參與,但setuptools網站有一個相當不錯的tutorial這樣做。

相關問題