2010-12-21 66 views
1

我想從一個特定的模塊(稱爲'命令')動態加載一個類,並且代碼在本地運行從本地Django服務器運行時運行得非常酷。但是,當我部署到Google App Engine時,這會發生爆炸。我試過將命令模塊的父模塊添加到進口以及無效(在這種情況下的任何設置)。代碼如下:如何在App Engine中動態導入模塊?

mod = __import__('commands.%s' % command, globals(), locals(), [command]) 
return getattr(mod, command) 

App Engine只要觸發它就會拋出一個ImportError。

並澄清,它不會在命令模塊上彈出。如果我有一個像'commands.cat'這樣的命令,它找不到'貓'。

+0

什麼是ImportError?您不應該在__import__調用中包含類名 - 只需執行__import __('commands')`(或者更好的做法是靜態地執行此操作),並且App Engine的導入掛鉤在這方面的行爲可能略有不同。 – 2010-12-21 22:53:45

回答

1

當我的文件夾/軟件包被命名爲「commands」時,我導入這種方式時出現導入錯誤。我將軟件包重命名爲「cmds」,一切正常。我猜想與名爲「命令」的內建命令有衝突。

__import__('cmds.' + command_name) 
0

尼克從AppEngine上隊約翰遜寫了一個博客張貼有關這個主題的,可以幫助你:

Webapps on App Engine, part 6: Lazy loading

的整批人推薦閱讀。

+0

在發佈這個問題之後,我實際上一直在使用他的blurb,但仍然沒有運氣。這有可能是App Engine的緩存協議嗎? – 2010-12-21 16:52:13

0

我的AppEngine框架MVCEngine動態導入控制器類。在上下文中的實際代碼可以在Google Code上瀏覽。

簡單地說,這裏是我如何做到這一點:

controller_name = "foo" 
controller_path = "app/controllers/%s_controller.py" % controller_name 
controller = __import__(controller_path) 
controllerClass = classForName(controller_name, namespace=controller.__dict__) 

classForName功能:

def classForName(name, *args, **kw): 
    ns = kw.get('namespace',globals()) 
    return ns[name](*args) 

我沒有讀過尼克對延遲加載的文章,上面提到的,但他是一個很值得AppEngine的權威性,他比我對AppEngine編碼的不同方法(所有重要的)的性能特徵有更好的理解。肯定讀了他的文章。

0

您可能希望有mapreduce.util.for_name看看它可以讓你動態地:另外,調用進口時,我不知道它的問題,但我只通過了價值,爲參數進口類/功能/方法。我保證:)我會把它包裝在一篇博文中。