Scott Ferguson
Scott Ferguson

Reputation: 889

How do I dynamically import a module in App Engine?

I'm trying to dynamically load a class from a specific module (called 'commands') and the code runs totally cool on my local setup running from a local Django server. This bombs out though when I deploy to Google App Engine. I've tried adding the commands module's parent module to the import as well with no avail (on either setup in that case). Here's the code:

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

App Engine just throws an ImportError whenever it hits this.

And the clarify, it doesn't bomb out on the commands module. If I have a command like 'commands.cat' it can't find 'cat'.

Upvotes: 1

Views: 356

Answers (4)

lukmdo
lukmdo

Reputation: 7649

You may want to have a look on mapreduce.util.for_name which lets you to dynamically import class/function/method. I promise :) I will wrap that in a blogpost.

Upvotes: 0

Andy Heimdahl
Andy Heimdahl

Reputation: 26

I was getting import errors when importing this way when my folder/package was named "commands". I renamed the package to "cmds" and everything worked. I'm guessing there was a conflict with a builtin named "commands". Also, I don't know if it matters, but I only passed a value for the name parameter when calling import:

__import__('cmds.' + command_name)

Upvotes: 1

Adam Crossland
Adam Crossland

Reputation: 14213

My AppEngine framework MVCEngine dynamically imports controller classes. The actual code in-context can be browsed on Google Code.

Briefly, here's how I do it:

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

and the classForName function:

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

I haven't read Nick's article on Lazy Loading, referenced above, but he is pretty much the authority on things AppEngine, and he has a better understanding than I do of the (all-important) performance characteristics of different approaches to coding for AppEngine. Definitely read his article.

Upvotes: 0

bgporter
bgporter

Reputation: 36504

Nick Johnson from the AppEngine team wrote up a blog post on this topic that may help you:

Webapps on App Engine, part 6: Lazy loading

The whole batch of them are recommended reading.

Upvotes: 0

Related Questions