我正在尝试从特定模块(称为“命令”)动态加载一个类,并且代码在从本地Django服务器运行的本地设置上运行得非常酷。当我部署到Google App Engine时,这会爆炸。我已经尝试将命令模块的父模块添加到 import ,但没有用(在这种情况下在任一设置上)。这是代码:
mod = __import__('commands.%s' % command, globals(), locals(), [command])
return getattr(mod, command)
App Engine在遇到此错误时会抛出一个ImportError。
澄清一下,它不会在命令模块上爆炸。如果我有一个像'commands.cat'这样的命令,它就找不到'cat'。
答案 0 :(得分:1)
当我的文件夹/包被命名为“commands”时,以这种方式导入时出现导入错误。我将包重命名为“cmds”,一切正常。我猜测与内置命名“命令”存在冲突。另外,我不知道是否重要,但在调用 import 时我只传递了 name 参数的值:
__import__('cmds.' + command_name)
答案 1 :(得分:0)
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,以便动态导入类/功能/方法。我保证:)我将把它包装在博客中。