2011-02-03 118 views
11

我在python中創建了一個項目,我很好奇包是如何在python中工作的。Python項目和包目錄佈局

這裏是我的目錄佈局:

top-level dir 
    \ tests 
    __init__.py 
    \ examples 
    __init__.py 
    example.py 
module.py 

我將如何去,包括我的example.py模塊module.py。我知道我可以將PYTHONPATH設置爲頂層目錄,但這似乎不是一個好的解決方案。這是pydev如何解決這個問題,但我想要一個不需要更新環境變量的解決方案。

我可以把東西在example.py頂部這樣的更新的sys.path:

from os import path 
import sys 

sys.path.append(path.dirname(path.abspath(path.dirname(__file__)))) 

我不認爲這是一個合適的解決辦法。

我覺得我錯過了python軟件包的一些基本部分。我在python 2.6上測試這個。如果需要進一步澄清,請告訴我。

+0

http://jcalderone.livejournal.com/39794.html – 2011-02-03 01:39:27

回答

8

Python包很簡單:一個包是在sys.path中有一個__init__.py文件中的任何條目下的任何目錄。但是,如果通過相對導入(例如import package.modulefrom package import module)導入模塊,則只會將模塊視爲IN包。請注意,這意味着通常,某人必須將sys.path設置爲包含要導入的任何程序包上方的目錄,無論是通過PYTHONPATH還是以其他方式。

主要的錯誤是主模塊(直接從命令行運行的)總是__main__,不管它們的位置。因此他們必須進行絕對導入,並且要麼依賴於PYTHONPATH的設置,要麼依靠自己的sys.path。

在你的情況,我建議要麼有一個小的Python腳本,在設置正確的路徑後運行你的例子。說你把它放在頂層目錄:

#!/usr/bin/env python 
import sys 
import os.path 

sys.path.append(os.path.dirname(__file__)) 
example = __import__("examples", globals(), locals(), sys.argv[1]) 

然後你的例子可以做「導入模塊」。

或者,如果module.py也用於包中,請將「頂級目錄」的PARENT添加到sys.path中,然後在示例模塊中使用from .. import module語法。另外,將第一個參數更改爲包裝中的__import__,以「tldname.examples」,其中tldname是您的頂級目錄的名稱。

如果您不想依賴「示例跑步者」模塊,那麼每個示例都需要sys.path樣板文件,或者您需要PYTHONPATH設置。抱歉。