Cómo usar virtualenv con Google App Engine SDK en Mac OS X 10.6


Me estoy tirando del pelo tratando de resolver esto porque lo tenía funcionando hasta la semana pasada y de alguna manera se rompió.

Cuando configuro un virtualenv para una aplicación de Google App Engine e inicio la aplicación con dev_appserver.py, obtengo errores al importar la biblioteca estándar (como "ImportError: No module named base64").

Esto es lo que estoy haciendo:

(Usando el sistema Python)

virtualenv --python=python2.5 --no-site-packages ~/.virtualenv/foobar

Luego agrego el archivo a gae.pth a ~/.virtualenv/foobar/lib/python2.5/site-packages/ que contiene el Motor de Google App bibliotecas:

/usr/local/google_appengine
/usr/local/google_appengine/lib/antlr3
/usr/local/google_appengine/lib/cacerts
/usr/local/google_appengine/lib/django
/usr/local/google_appengine/lib/fancy_urllib
/usr/local/google_appengine/lib/ipaddr
/usr/local/google_appengine/lib/webob_1_1_1
/usr/local/google_appengine/lib/yaml/lib

(Eso se basa en esta respuesta.)

Entonces fuente mi "foobar" virtualenv e intento iniciar mi aplicación con dev_appserver.py.

El servidor se inicia pero la primera solicitud se equivoca con el mencionado "ImportError: No module named base64". Si visito la consola de administración obtengo "ImportError: No module named cgi".

Si arranco python, puedo cargar estos módulos.

>>> import base64
>>> base64.__file__
'/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/base64.py'

Parece que el sandboxing del SDK está previniendo estos bibliotecas de conseguir cargado. Pero como dije, tenía esto funcionando hasta la semana pasada...algo cambió o sin querer rompí mi virtualenv y no puedo entender cómo lo hice funcionar en primer lugar.

Versiones de software:

Google App Engine SDK 1.3.7
Mac OS X Snow Leopard 10.6.4
virtualenv 1.5.1

Actualización: En respuesta a las preguntas de Alan Franzoni:

Estoy usando el sistema Python que vino con Mac OS X. Instalé virtualenv vía easy_install. He actualizado a virtualenv 1.5.1 hoy para tratar de solucionar el problema.

Si corro python /usr/local/bin/dev_appserver.py con el python virtualenv, el problema persiste. Si desactivo el virtualenv y corro ese comando con el sistema python2.5, funciona. (También, puedo utilizar el GoogleAppEngineLauncher para iniciar mi aplicación.)

Aquí hay un seguimiento de pila completa (este utiliza el framework Kay, pero el problema es el mismo con webapp):

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3206, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3149, in _Dispatch
    base_env_dict=env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 525, in Dispatch
    base_env_dict=base_env_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2402, in Dispatch
    self._module_dict)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2312, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2208, in ExecuteOrImportScript
    exec module_code in script_module.__dict__
  File "/Users/look/myapp/kay/main.py", line 17, in <module>
    kay.setup()
  File "/Users/look/myapp/kay/__init__.py", line 122, in setup
    from google.appengine.ext import db
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1937, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1839, in FindAndLoadModule
    description)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1287, in Decorate
    return func(self, *args, **kwargs)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 1790, in LoadModuleRestricted
    description)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/db/__init__.py", line 81, in <module>
    import base64
ImportError: No module named base64
Author: Community, 2010-10-05

5 answers

Es un problema 4339 con el SDK de GAE, está confirmado y hay dos parches ligeramente diferentes disponibles en la entrada de error que lo hacen funcionar.

Lo que sucede es que dev_appserver.py establece un entorno python restringido al no permitir el acceso a cualquier módulo que no sea system-python y lo hace calculando la carpeta system python desde la ubicación del módulo os. En una instancia de virtualenv, os.py se enlaza simbólicamente con virtualenv, pero se compila directamente en virtualenv, y esta es la ruta que dev_appserver utiliza, bloqueando efectivamente el acceso a cualquier módulo de la biblioteca de python del sistema que no esté vinculado por virtualend, que es la mayoría de ellos. La solución es "bendecir" ambos caminos.

 15
Author: bozzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-01 06:53:13

Google AppEngine SDK hace un montón de truco con el fin de tirar de su instalación en los sistemas.ruta, y estos trucos se basan en la ruta del archivo real. Creo que puede haber muchas razones por las que falla. SDK no se instala como un paquete python real, virtualenv no hace un sandboxing completo, solo configura un entorno (obviamente) y cambia los sistemas.camino. Y GAE SDK hace esto también, ambos intefere, SDK se está desarrollando rápidamente y cambiando a menudo, por lo que este es un camino extremadamente accidentado a Ve.

Probablemente, sería mejor si usted explicara lo que está tratando de lograr. Mi conjetura es que usted está tratando de crear un ambiente limpio para asegurarse de que ningún módulo de terceros está disponible para la aplicación. Si esta suposición es correcta, iría con la instalación de GAE SDK en virtualenv a través de archivos de requisitos como se describe aquí .

 2
Author: eGlyph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-18 20:08:00

Creo que, ya que ha configurado virtualenv con la opción no no-site-packages, necesita instalar el SDK en el entorno. -- no-site-packages separa el entorno dev que está configurando de cualquier otra instalación de Python en su computadora por lo que, como parece que lo tiene configurado, está llamando a un módulo que no existe (en el entorno) por lo que funciona con el env desactivado (que luego ejecuta Python desde la instalación del sistema operativo predeterminada). Prueba a configurar el env dev sin la opción no no-site-packages si desea poder acceder a módulos fuera del env.

 1
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-07 16:23:01

Soy un poco tarde a la conversación, pero estaba teniendo el mismo problema y me topé con gae_installer, que se puede instalar de la forma habitual con pip install gae_installer. Esto pondrá el sdk de Google app engine (gae) directamente en su ruta de Python. Espero que otros encuentren esto útil.

 1
Author: dino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-25 11:02:50

La misma respuesta que bozzo. Aquí están las instrucciones:

Esto se describe en Número 4339 para GAE. He aquí cómo solucionarlo:

  1. Descargue el parche aquí: parche
  2. Mueva el parche a google_appengine/google/appengine/tools /
  3. Cambie su directorio de trabajo a la misma ruta que la anterior
  4. Type: patch-p0
 0
Author: Lionel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 08:29:12