2012-05-02 58 views
2

我看到這個問題以前已經被問過了,但我仍然試圖讓我的頭腦與Python模塊的工作。 我的應用程序有一個非常基本結構:一般Python模塊

app/ 
    __init__.py 
    driver.py 
    dbloader/ 
    __init__.py 
    loader.py 

兩個__init__.py文件是空的。 driver.py只有一個類驅動程序()和loader.py中有唯一的類加載器()

因此,爲了測試這個設置,cd到應用程序/目錄裏面。從這裏我開始一個python shell。然後我嘗試:

import dbloader哪些工作(即沒有錯誤)。但是,我試過每個排列來實例化loader.py內的Loader()都無濟於事。我已經試過的人的一些的是:

from dbloader import loader 
from dbloader.loader import Loader 

我也試過

進口只是dbloader然後試圖實例如下:

import dbloader 
l = dbloader.Loader() 

一切都無濟於事。我相信在其他地方閱讀當前目錄和子目錄在執行python shell時會自動包含在pythonpath中(這是真的嗎?)

無論如何,任何幫助都將不勝感激。

+0

當你輸入dbloader時 l = dbloader.Loader(),你會得到什麼錯誤? –

+0

我不知道爲什麼你看到你的兩個解決方案的問題:'從dbloader導入加載器'和'從dbloader.loader導入加載器'。第一個應該提供'Loader'作爲'loader.Loader',第二個應該是'Loader'。你可以發佈堆棧跟蹤嗎? – Darthfett

+0

Niek和Darth,我得到的錯誤是'無法導入名稱加載器',但它已被修復,因爲遵循了Daniel以下的建議,看起來與我已經在做的事情類似,所以它可能是一個糟糕的例子肥胖的手指。 – rdodev

回答

3

dbloader本身沒有任何提及Loader類。但是,您需要通過loader命名空間。所以,兩種可能的方式:

from dbloader import loader 
l = loader.Loader() 

from dbloader.loader import Loader 
l = Loader() 

它有助於思考的命名空間,而不是模塊或類。 Loader位於dbloader.loader命名空間中,並且要訪問該類,您需要將類本身或包含它的模塊導入當前名稱空間。

+0

非常感謝。這有助於爲我澄清事情。 – rdodev

2

import XX添加到您的名稱空間。

import dbloader - 這增加了moduledbloader。您可以使用dbloader.loader.Loader

from dbloader import loader - 這會將模塊loader添加到您的名稱空間。你可以通過loader.Loader訪問你的課程。

from dbloader.loader import Loader - 將類Loader導入到您的名稱空間。你只需在這裏使用Loader()

嘗試在dirhelp的python shell中玩耍,你應該能夠理解結構稍好一點。

+0

實際上,如果'dbloader'的'__init __。py'爲空,則執行以下操作: 'import dbloader; dbloader.loader' 將會失敗,因爲'import dbloader'只是執行'__init __。py'文件並將名稱'dbloader'鏈接到它的作用域,而'loader'不存在。您需要運行 '從dbloader import loader'或'import dbloader.loader'獲得對'loader'的訪問。 – majackson

+0

@majackson,你是對的。 – Daenyth

0

除了使用Daenyth和丹尼爾·羅斯曼提出的解決方案,可以從dbloader直接訪問Loader,如果從進口在dbloader裝載機:

# app/dbloader/__init__.py 
from dbloader.loader import Loader 

然後,在你的shell:

import dbloader 
l = dbloader.Loader() 

# or... 

from dbloader import Loader 
l2 = Loader() 

這是清理命名空間的一個很好的解決方案。

+1

需要這通常意味着你的模塊結構是錯誤的。 – Daenyth

+0

@Daenyth我不會說'平時'。如果你有一個非常大的自包含類,那麼把它放在它自己的文件中是有意義的。例如,在'util'模塊中的一個數學矢量類'Vector'會令人討厭從任何地方導入爲'from util.vector import Vector'。 – Darthfett

+0

這可能是一個有效的例子,但我更多地指的是你從java獲得持久性的東西,比如每個文件有一個類,當這個類是10行(並且不需要甚至是一個類的時候) ...) – Daenyth