Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GAE 1.5.5 local SDK fails to run with python2.7 runtime

GAE 1.5.5 looks to have some excellent, long-waited for features. However, they're not working for me yet.

I've downloaded and installed GAE 1.5.5, and am using a degenerate "AAA" app to test.

Here's roughly my app.yaml (with various changes having been made for testing).

app.yaml

application: AAA # mystical creation.
version: alpha-1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /media
 static_dir: media/

- url: /favicon.ico
 static_files: media/images/favicon.ico
 upload: media/images/favicon.ico

- url: /admin
 script: AAA.app
 login: admin

- url: /.*
 script: AAA.app

skip_files:
- ^(.*/)?app\.yaml

libraries:
- name: django
 version: "1.2"
- name: jinja2
 version: latest
- name: yaml
 version: latest

I'm running this on Mac OS X Lion (10.7.1).

I hypothesize that I am not actually using the Python 2.7 runtime, in spite of the declaration in app.yaml to use it. I'm not quite sure how to validate this theory, but the errors I've encountered are consistent with it. These errors are reproduced below.

Python Path

When Google App Engine's Python Path is not set, the app engine runs using Python 2.6.6.

To fix this I set Python Path to /usr/bin/python2.7 in the Google App Engine preferences.

WSGI

I get the following error:

 /Applications/GoogleAppEngineLauncher.app/Contents/Resources/
GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/
google/appengine/tools/dev_appserver.py in
GetParentPackage(self=<google.appengine.tools.dev_appserver.HardenedModulesHook
object>, fullname='AAA.app')
  2334
  2335       if self.find_module(fullname) is None:
=> 2336         raise ImportError('Could not find module %s' %
fullname)
  2337
  2338       return self._module_dict[parent_module_fullname]
builtin ImportError = <type 'exceptions.ImportError'>, fullname =
'AAA.app'
<type 'exceptions.ImportError'>: Could not find module AAA.app
     args = ('Could not find module AAA.app',)
     message = 'Could not find module AAA.app'

Where I've tried AAA.app as:

AAA.py:

 from google.appengine.dist import use_library
 use_library('django', '1.2') # otherwise we still get django 0.96

 from django.core.handlers import wsgi
 app = wsgi.WSGIHandler()

AAA/__init__.py

# same content as above

AAA/AAA.py

# same content as above

Note that I can continue to run CGI with app.yaml and AAA.py modified, mutatis mutandis. However doing so nevertheless results in those errors below:

Jinja2

When I run import jinja2 I get an ImportError.

Django2

Without:

from google.appengine.dist import use_library
use_library('django', '1.2')

I end up with Django 0.96.

Theory

Given the following:

  • http://code.google.com/appengine/docs/python/tools/libraries27.html states "The use_library() function provided by the google.appengine.dist package is unavailable in Python 2.7."
  • use_library works for me
  • use_library is required because the "libraries: {django: {..., version: "1.2"}} declaration does not set the django version to 1.2
  • Only Django 1.2 is included in the Python 2.7 runtime (per the libraries27.html link above)
  • I have to manually specify Python 2.7 in the Python Path in order for GAE to use Python 2.7
  • WSGI doesn't load the application properly
  • Jinja2 cannot be imported

I believe I am not really using the Python 2.7 GAE runtime (i.e. the app.yaml declaration is being ignored in the GAE 1.5.5 SDK).

I hope the above is a helpful description, and I'd be grateful for any thoughts as to what may be happening here – and potential solutions.

like image 365
Brian M. Hunt Avatar asked Oct 12 '11 12:10

Brian M. Hunt


3 Answers

I'm have the same issue but on Windows, I posted on the Google App Engine forum and here is an official response I got:

The Dev server doesn't support 2.7 yet. Currently the only way to test 2.7 based code is on appengine

like image 191
Shay Erlichmen Avatar answered Sep 28 '22 09:09

Shay Erlichmen


You can use the 2.7 runtime with the local SDK, but just not in threadsafe mode, or with your application defined like script: your.app. Instead use script: your_main_script.py.

For jinja2 and webapp2 which aren't available in the SDK, you can download them and place them in the SDK base directory, which is by default added to sys.path.

You won't be able to test the multithreading capabilities, but you can do everything else, and simply make the changes to app.yaml and your_main_script.py before you deploy.

EDIT: Also, I had to do os.environ[u'APPENGINE_RUNTIME'] = u'python27' in my your_main_script.py, to force the SDK to use webapp2.

like image 38
Steven Kampen Avatar answered Sep 28 '22 08:09

Steven Kampen


Allbuttonspressed has recently posted this handy guide;
you can rundev_appserver on Python27 with threadsafe set to yes.

like image 31
systempuntoout Avatar answered Sep 28 '22 07:09

systempuntoout