2010-02-02 42 views
15

導入模塊,這是一個Python新手問題:嵌套包

我有以下目錄結構:

test 
-- test_file.py 
a 
-- b 
    -- module.py  

其中testab是文件夾。 testa都處於同一水平。

module.py有一個名爲shape的類,我想在test_file.py中實例化它的一個實例。我該怎麼做?

我曾嘗試:

from a.b import module 

但我得到:

ImportError: No module named a.b 
+0

請參閱http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python。 – 2010-02-02 10:30:33

回答

13

你想要的是像一個相對進口:

from ..a.b import module

這樣做的問題是,如果你正在爲你的主模塊調用test_file.py這是行不通的。如前所述here

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application should always use absolute imports.

所以,如果你想打電話test_file.py作爲主模塊,那麼你應該考慮改變你的模塊的結構和使用絕對導入,否則只使用相對進口從上面。

+0

+1。我沒有注意到他試圖從哪裏進口。 – 2010-02-02 10:40:50

+1

向(我不知道)down-voter:當你對一個答案投下贊成票時,你應該留下一個解釋它的錯誤的評論,這樣任何讀它的人(和作者)都可以被告知錯誤... – 3lectrologos 2010-02-02 11:33:11

+0

我得到ValueError:試圖在非包中嘗試相對導入 – khelll 2010-02-02 12:06:47

7

做的第一件事將是快速瀏覽the official docs on this

要使一個目錄成爲一個包,您必須添加一個__init__.py文件。這意味着您將在ab目錄中擁有這樣的文件。然後你就可以直接做一個

import a.b.module 

但你必須把它稱爲a.b.module這是單調乏味的,所以你可以使用as形式進口的,像這樣

import a.b.module as mod #shorter name 

,並引用它作爲mod

然後,您可以使用常規約定mod.shape()mod內實例化事物。

還有一些其他的微妙之處。請詳細閱讀文檔。

+0

我沒有導入abmodule爲mod併爲所有軟件包添加了__init__.py,但我得到了ImportError:沒有名爲abmodule的模塊 – khelll 2010-02-02 12:03:47

+0

@khell你應該像python test/test_file.py那樣從根目錄運行命令 – systempuntoout 2010-06-20 19:32:57

+1

它是'__init__。 py'。不是'init.py'。詳細信息請查看答案中的鏈接。 – 2010-06-21 07:58:17

9
  1. 目錄a需要是一個包。添加__init__.py文件使其成爲一個包,這是一個簡單的目錄。

  2. 該目錄b也需要是a的子包裝。添加一個__init__.py文件。

  3. 目錄test應該也可能是一個包。很難說如果這是必要的或不。 Python模塊的每個目錄都是一個正式的包通常是一個好主意。

  4. 爲了import,包需要在sys.path;這是從PYTHONPATH環境變量構建的。默認情況下,已安裝的站點包和當前工作目錄是(有效)唯一可以找到包的兩個地方。

    這意味着必須安裝a,或者,您當前的工作目錄也必須是高於a的一個級別的軟件包。

    或者,您需要將您的PYTHONPATH環境變量設置爲包括a

http://docs.python.org/tutorial/modules.html#the-module-search-path

http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

此外,http://docs.python.org/library/site.htmlsys.path如何構建完整的信息。