views:

121

answers:

3

I have created a simple GAE app based on the default template. I want to add an external module like short_url. How do I do this? The directions that I have found so far are confusing and GAE doesn't seem to use PYTHONPATH for obvious reasons I guess.

A: 

Since that url_shortener program written in python, you could just include in your source code and import it like other python modules.

S.Mark
+8  A: 

Simply place the short_url.py file in your app's directory.

Sample App Engine project:

myapp/
    app.yaml
    index.yaml
    main.py
    short_url.py
    views.py

And in views.py (or wherever), you can then import like so:

import short_url

For more complex projects, perhaps a better method is to create a directory especially for dependencies; say lib:

myapp/
    lib/
        __init__.py
        short_url.py
    app.yaml
    index.yaml
    main.py
    views.py
from lib import short_url

Edit #2:
Apologies, I should have mentioned this earlier. You need modify your path, thanks to Nick Johnson for the following fix.
Ensure that this code is run before starting up your app; something like this:

import os
import sys

def fix_path():
    # credit:  Nick Johnson of Google
    sys.path.append(os.path.join(os.path.dirname(__file__), 'lib'))

def main():
    url_map = [ ('/', views.IndexHandler),] # etc.
    app = webapp.WSGIApplication(url_map, debug=False)
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
    fix_path()
    main()

Edit3:
To get this code to run before all other imports, you can put the path managing code in a file of its own in your app's base directory (Python recognizes everything in that directory without any path modifications).
And then you'd just ensure that this import

import fix_path

...is listed before all other imports in your main.py file.
Here's a link to full, working example in case my explanation wasn't clear.

Adam Bernier
I'm still getting an issue, even after I restart the app server with this layout.from lib import short_urlImportError: No module named lib
BrianLy
@Brian: apologies, I should have mentioned the required path modification earlier. Please see updated answer.
Adam Bernier
Thanks - it's working now. Where is the best place to call fix_path()? I'm calling it this way:if __name__ == '__main__': fix_path() main()And then I have this function called from my code:def generate_key(id): import short_url return short_url.encode_url(id)Is there somewhere I can call fix_path() that let's you keep all imports together at the top of the file?
BrianLy
@Brian: great. Glad you got it working. I'll add another example to allow you to keep the imports in one spot.
Adam Bernier
A: 

i will second the answers given by @Adam Bernier and @S.Mark, although adam's explains things is a bit more detail. in general, you can add any pure Python module/package to your App Engine directory and use as-is, as long as they don't try to work outside of the sandbox, i.e, cannot create files, cannot open network sockets, etc.

also keep in mind the hard limits:

  • maximum total number of files (app files and static files): 3,000
  • maximum size of an application file: 10 megabytes
  • maximum size of a static file: 10 megabytes
  • maximum total size of all application and static files: 150 megabytes
wescpy