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

Python 如何在App Engine中动态导入模块?,python,django,google-app-engine,Python,Django,Google App Engine,我试图从一个特定的模块(称为“commands”)动态加载一个类,代码在本地Django服务器运行的本地设置上运行得非常酷。不过,当我部署到谷歌应用程序引擎时,它就爆炸了。我尝试将命令模块的父模块添加到导入中,但没有成功(在这种情况下,在两种设置中都是如此)。代码如下: mod = __import__('commands.%s' % command, globals(), locals(), [command]) return getattr(mod, command) 应用程序引擎只要碰到

我试图从一个特定的模块(称为“commands”)动态加载一个类,代码在本地Django服务器运行的本地设置上运行得非常酷。不过,当我部署到谷歌应用程序引擎时,它就爆炸了。我尝试将命令模块的父模块添加到导入中,但没有成功(在这种情况下,在两种设置中都是如此)。代码如下:

mod = __import__('commands.%s' % command, globals(), locals(), [command])
return getattr(mod, command)
应用程序引擎只要碰到这个就会抛出一个错误


澄清一下,它不会在命令模块上爆炸。如果我有一个类似“commands.cat”的命令,它就找不到“cat”。

AppEngine团队的尼克·约翰逊(Nick Johnson)写了一篇关于这个主题的博文,可能会帮助您:


推荐阅读整批内容。

AppEngine团队的尼克·约翰逊(Nick Johnson)就这一主题撰写了一篇博文,可能会对您有所帮助:


建议阅读整批内容。

My AppEngine framework MVCEEngine动态导入控制器类。可以浏览上下文中的实际代码

简而言之,我是这样做的:

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关于延迟加载的文章,但他在AppEngine方面几乎是权威,而且他比我更了解为AppEngine编写代码的不同方法(非常重要)的性能特征。肯定读过他的文章。

我的AppEngine框架MVCEEngine动态导入控制器类。可以浏览上下文中的实际代码

简而言之,我是这样做的:

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关于延迟加载的文章,但他在AppEngine方面几乎是权威,而且他比我更了解为AppEngine编写代码的不同方法(非常重要)的性能特征。肯定读过他的文章。

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

__import__('cmds.' + command_name)

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

__import__('cmds.' + command_name)

您可能想看看哪个可以动态导入类/函数/方法。我保证:)我会把它写在博客里

您可能想看看哪个可以动态导入类/函数/方法。我保证:)我会把它写在博客里

事实上,我在发布这个问题后不久就开始使用他的宣传语,但仍然没有运气。这可能是AppEngine方面的缓存交易吗?事实上,我在发布这个问题后不久就一直在使用他的广告,但仍然没有运气。这可能是应用引擎方面的缓存交易吗?最可怕的是什么?您不应该在导入调用中包含类名-只需执行
\uuuuu import\uuuuuu('commands')
(或者更好的是,静态执行),并且App Engine的导入挂钩在这方面的行为可能略有不同。导入错误是什么?您不应该在导入调用中包含类名-只需执行
\uuuuu import\uuuuu('commands')
(或者更好的是,静态地执行),App Engine的导入挂钩在这方面的行为可能略有不同。