2011-10-11 79 views
4

我有幾個項目目錄,並希望具有特定於它們的庫/模塊。舉例來說,我可能有一個像這樣的目錄結構:python本地模塊

myproject/ 
    mymodules/ 
    __init__.py 
    myfunctions.py 
    myreports/ 
    mycode.py 

假設有一個名爲addmyfunctions.py功能,我可以從mycode.py用最幼稚的程序調用它:

execfile('../mymodules/myfunctions.py') 
add(1,2) 

但要我也可以做

import sys 
sys.path.append('../mymodules') 
import myfunctions 

myfunctions.add(1,2) 

這是最習慣的方式嗎?還有一些關於修改PYTHONPATHos.environ['PYTHONPATH']?)的提及,但是我應該看看這個還是其他的東西?

此外,我已經看到import語句包含在類聲明中,並在其他情況下,定義在包含類定義的Python文件的頂部。有沒有權利/首選的方式來做到這一點?

+2

你的*更復雜的方法*,你正在修改PYTHONPATH,所以,這是最好的方法 –

+0

直接將'mycode.py'移動到'myproject' –

+0

@Eknath Iyer,你是對的...我不知道是否最好增加'PYTHONPATH'變量directoy(這在技術上與'sys.path'中定義的搜索路徑不同)?正如'os.environ [PYTHONPATH] + =':../ mymodules''什麼的。 – hatmatrix

回答

10

不要搞execfilesys.path.append,除非有一些非常好的理由。相反,只需將您的代碼安排到proper python packages中,並像進行其他任何庫一樣進行導入。

如果您mymodules其實是在一個大項目的一部分,然後設置你的包像這樣:

myproject/ 
    __init__.py 
    mymodules/ 
     __init__.py 
     myfunctions.py 
    myreports/ 
     __init__.py 
     myreportscode.py 

然後你就可以在你的代碼從任何地方進口mymodules這樣的:

from myproject.mymodules import myfunctions 
myfunctions.add(1, 2) 

如果您的mymodules代碼被許多獨立和不同的項目使用,那麼只需將它自己編譯爲一個包,然後將其安裝到需要使用的任何環境中即可。

+0

謝謝 - 但我只想通過我的項目訪問它,並且我希望它是可移植的,這樣我只需將「myproject」移動到另一臺計算機即可重現它。 myreports /只需要在mymodules中調用函數/而不是其他方式,所以出於這些原因,我不想製作一個系統範圍的程序包。 – hatmatrix

+0

所以這可能是「非常神的原因」的情況畢竟...... – hatmatrix

+0

我的建議會讓你的「myproject」便攜,不需要任何東西,只需要一個標準的軟件包設置。 –