30 votes

Comment utiliser virtualenv avec Google App Engine SDK sur Mac OS X 10.6

Je m'arrache les cheveux à essayer de résoudre ce problème, car il fonctionnait jusqu'à la semaine dernière et s'est cassé.

Lorsque je configure un virtualenv pour une application Google App Engine et que je lance l'application avec dev_appserver.py J'obtiens des erreurs lors de l'importation de la bibliothèque standard (comme "ImportError : No module named base64").

Voilà ce que je fais :

(En utilisant le système Python)

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

Ensuite, j'ajoute l'a gae.pth pour ~/.virtualenv/foobar/lib/python2.5/site-packages/ contenant les bibliothèques de Google App Engine :

/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

(C'est basé sur cette réponse .)

Ensuite, je crée mon virtualenv "foobar" et j'essaie de lancer mon application avec dev_appserver.py .

Le serveur démarre mais la première requête se termine par l'erreur "ImportError : No module named base64". Si je visite la console d'administration, j'obtiens "ImportError : No module named cgi".

Si je lance python, je peux charger ces modules.

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

Il semble que le sandboxing du SDK empêche ces bibliothèques d'être chargées. Mais comme je l'ai dit, cela fonctionnait jusqu'à la semaine dernière... quelque chose a changé ou j'ai cassé mon virtualenv par inadvertance et je n'arrive pas à comprendre comment j'ai pu le faire fonctionner en premier lieu.

Versions du logiciel :

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

Mise à jour : En réponse aux questions d'Alan Franzoni :

J'utilise le système Python fourni avec Mac OS X. J'ai installé virtualenv via easy_install. J'ai effectué une mise à niveau vers virtualenv 1.5.1 aujourd'hui pour essayer de résoudre le problème.

Si je cours python /usr/local/bin/dev_appserver.py avec le python virtualenv, le problème persiste. Si je désactive le virtualenv et exécute cette commande avec le système python2.5, cela fonctionne. (De plus, je peux utiliser le GoogleAppEngineLauncher pour démarrer mon application).

Voici une trace de pile complète (celle-ci utilise le framework Kay, mais le problème est le même avec 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

15voto

bozzo Points 166

C'est un numéro 4339 avec le SDK GAE, c'est confirmé et il y a deux correctifs légèrement différents disponibles dans l'entrée de bogue qui le font fonctionner.

Ce qui se passe, c'est que dev_appserver.py met en place un environnement python restreint en interdisant l'accès à tous les modules qui ne font pas partie du système python. Pour ce faire, il calcule le dossier python du système à partir de l'emplacement du fichier os module. Dans une instance de virtualenv, le module os.py est mis en lien symétrique dans le virtualenv mais obtient compilé directement dans virtualenv, et c'est le chemin que dev_appserver utilise, bloquant efficacement l'accès à tout module de la bibliothèque python du système qui n'est pas lié par virtualend, ce qui est le cas de la plupart d'entre eux. La solution est de "bénir" les deux chemins.

2voto

eGlyph Points 760

Google AppEngine SDK a recours à de nombreuses astuces pour placer son installation dans sys.path, et ces astuces reposent sur le chemin d'accès réel du fichier. Je pense qu'il peut y avoir beaucoup de raisons différentes pour lesquelles cela échoue. Le SDK ne s'installe pas comme un vrai paquet python, virtualenv ne fait pas de sandboxing complet, il se contente de créer un environnement (évidemment) et de modifier sys.path. Le SDK de GAE fait la même chose, ils interfèrent tous les deux, le SDK se développe rapidement et change souvent, c'est donc un chemin extrêmement difficile à parcourir.

Il serait probablement préférable que vous expliquiez ce que vous essayez d'obtenir. Je pense que vous essayez de créer un environnement propre pour vous assurer qu'aucun module tiers n'est disponible pour l'application. Si cette supposition est correcte, j'installerais GAE SDK dans virtualenv via les fichiers d'exigences comme décrit ci-dessous aquí .

1voto

Brian Points 34

Je pense que, puisque vous avez configuré virtualenv avec l'option --no-site-packages, vous devez installer le SDK dans l'environnement. L'option --no-site-packages sépare l'environnement de développement que vous configurez de toute autre installation de Python sur votre ordinateur. Ainsi, comme vous semblez l'avoir configuré, vous appelez un module qui n'existe pas (dans l'environnement), ce qui explique pourquoi il fonctionne avec l'environnement désactivé (qui exécute alors Python à partir de l'installation par défaut du système d'exploitation). Essayez de configurer l'environnement de développement sans l'option --no-site-packages si vous voulez pouvoir accéder à des modules en dehors de l'environnement.

0voto

Lionel Points 924

Même réponse que bozzo. Voici les instructions :

Ceci est décrit dans Numéro 4339 pour GAE. Voici comment le réparer :

  1. Téléchargez le patch ici : patch
  2. Déplacez le patch vers google_appengine/google/appengine/tools/
  3. Changez votre répertoire de travail pour le même chemin que ci-dessus
  4. Type : patch -p0 < dev_appserver.patch

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X