如何在App Engine中动态导入模块?

时间:2010-12-21 15:16:57

标签: python django google-app-engine

我正在尝试从特定模块(称为“命令”)动态加载一个类,并且代码在从本地Django服务器运行的本地设置上运行得非常酷。当我部署到Google App Engine时,这会爆炸。我已经尝试将命令模块的父模块添加到 import ,但没有用(在这种情况下在任一设置上)。这是代码:

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

App Engine在遇到此错误时会抛出一个ImportError。

澄清一下,它不会在命令模块上爆炸。如果我有一个像'commands.cat'这样的命令,它就找不到'cat'。

4 个答案:

答案 0 :(得分:1)

当我的文件夹/包被命名为“commands”时,以这种方式导入时出现导入错误。我将包重命名为“cmds”,一切正常。我猜测与内置命名“命令”存在冲突。另外,我不知道是否重要,但在调用 import 时我只传递了 name 参数的值:

__import__('cmds.' + command_name)

答案 1 :(得分:0)

来自AppEngine团队的Nick Johnson撰写了一篇关于此主题的博客文章,可能对您有所帮助:

Webapps on App Engine, part 6: Lazy loading

推荐阅读全批。

答案 2 :(得分: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)

我没有读过Nick关于上面引用的Lazy Loading的文章,但他几乎是AppEngine的权威,他对我的不同方法的(所有重要的)性能特征有了更好的理解。编写AppEngine。绝对阅读他的文章。

答案 3 :(得分:0)

您可能需要查看mapreduce.util.for_name,以便动态导入类/功能/方法。我保证:)我将把它包装在博客中。