2012-02-16 62 views
2

我剛剛開始使用python,並且對理解包內模塊加載的搜索路徑有困難。我有這樣的結構:Intrapack模塊在python中的加載

top/      Top-level package 
    __init__.py    Initialize the top package 
    src/     Subpackage for source files 
     __init__.py 
     pkg1/   Source subpackage 1 
     __init__.py   
     mod1_1.py 
     mod1_2.py 
     ... 
     pkg2/   Source subpackage 2 
     __init__.py 
     mod2_1.py 
     mod2_2.py   
     ... 
     ... 
    test/     Subpackage for unit testing 
     __init__.py 
     pkg1Test/  Tests for subpackage1 
     __init__.py 
     testSuite1_1.py 
     testSuite1_2.py 
     ... 
     pkg2Test/  Tests for subpackage2 
     __init__.py 
     testSuite2_1.py 
     testSuite2_2.py 
     ... 
    ... 

在testSuite1_1我需要導入模塊mod1_1.py(依此類推)。我應該使用哪些進口聲明? Python的官方教程(位於docs.python.org,sec 6.4.2)說:

「如果在當前包(當前模塊是子模塊的包)中找不到導入的模塊,則導入語句查找具有給定名稱的頂級模塊。「

我把這個意思,我可以使用(從內testSuite1_1.py):

從src.pkg1進口mod1_1

進口src.pkg1.mod1_1

既不可行。我在這裏閱讀了幾個類似問題的答案,但找不到解決方案。

編輯:我改變了模塊名稱,遵循Python的命名約定。但是我仍然無法得到這個簡單的例子。

+0

這給我一個破折號的語法錯誤。 – 2012-02-16 03:03:59

回答

0

問題與http://legacy.python.org/doc/essays/packages.html幫助解決(在類似的問題的統稱)。關鍵之處在於:

「爲了讓Python程序使用包,必須通過import語句找到包,換句話說,包必須是包在sys.path上保存一個包的最簡單方法是將它安裝在標準庫中或讓用戶通過設置$ sys PYTHONPATH shell環境變量「

將路徑添加到」top「到PYTHONPATH解決了這個問題。爲了使解決方案具有可移植性(這是一個個人項目,但我需要在多臺機器上共享它),我想有一個最小化top/setup.py中的初始化代碼應該可以工作。

+0

現在鏈接已損壞 – Michael 2017-01-24 17:21:44

+0

修復了指向舊版網站的鏈接 – stefano 2017-01-24 22:51:10

2

模塊名稱不包含.py擴展名。另外,在你的例子中,頂級模塊實際上被命名爲top。最後,連字符對python中的名字不合法,我建議用下劃線替換它們。然後嘗試:

from top.src.pkg1 import mod1_1 
+0

我更改了名稱以遵循約定,但我仍然遇到與您的建議語法相同的錯誤 – stefano 2012-02-16 14:29:26

+0

PYTHONPATH中的「top」文件夾? – tzaman 2012-02-17 00:21:22