2010-10-04 7 views
30

Ich ziehe mir die Haare aus, um das herauszufinden, weil ich es bis letzte Woche funktionierte und es irgendwie kaputt ging.Wie benutze ich virtualenv mit Google App Engine SDK unter Mac OS X 10.6

Wenn ich ein virtualenv für eine Google App Engine App einrichte und die App mit dev_appserver.py starte, bekomme ich Fehler beim Importieren der Standardbibliothek (wie "ImportError: Kein Modul namens base64").

Hier ist, was ich tue:

(das System mit Python)

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

Dann füge ich die eine gae.pth Datei zu ~/.virtualenv/foobar/lib/python2.5/site-packages/ enthält die Google App Engine-Bibliotheken:

/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 

(Das basiert auf this answer.)

Dann Quelle ich meine "Foobar" virtualenv und versuche, meine App mit dev_appserver.py zu starten.

Der Server startet aber die erste Anfrage Fehler mit dem oben genannten "ImportError: Kein Modul namens Base64". Wenn ich die Admin-Konsole besuche bekomme ich "ImportError: Kein Modul namens CGI".

Wenn ich Python starte, kann ich diese Module laden.

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

Es scheint, dass das Sandboxing des SDK verhindert, dass diese Bibliotheken geladen werden. Aber wie ich schon sagte, ich habe das bis letzte Woche gearbeitet ... irgendwas hat sich geändert oder ich habe versehentlich meinen virtualenv kaputt gemacht und ich kann mir nicht vorstellen, wie ich es überhaupt funktionierte.

Software-Versionen:

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

Update: Als Reaktion auf Alan Franzoni die Fragen:

Ich benutze das System Python, das mit Mac OS X kam. Ich installierte virtualenv über easy_install. Ich habe heute ein Upgrade auf virtualenv 1.5.1 durchgeführt, um das Problem zu beheben.

Wenn ich python /usr/local/bin/dev_appserver.py mit dem virtualenv Python ausführen, bleibt das Problem bestehen. Wenn ich den virtualenv deaktiviere und diesen Befehl mit dem System python2.5 ausführe, funktioniert es. (. Außerdem kann ich die GoogleAppEngineLauncher verwenden, um meine app zu starten)

Hier ist ein Full-Stack-Trace (dieses verwendet den Kay Rahmen, aber das Problem ist das gleiche mit 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 
+0

Könnten Sie bitte die volle Ausgabe für einen solchen Fehler ausschneiden und einfügen? Wenn Sie "python /usr/local/bin/dev_appserver.py" verwenden, bleibt der Fehler gleich? Wie haben Sie virtualenv über setuptools installiert? Und verwenden Sie System Python2.5, Macports eins, jede Kombination von denen? –

+0

Danke für Ihre Antwort. Ich habe den Beitrag aktualisiert, um Ihre Fragen zu beantworten. –

+0

Können Sie "which python" eingeben, um sicherzustellen, dass Sie den virtualenv Python ausführen? – varikin

Antwort

15

Es ist ein issue 4339 mit dem GAE SDK, es ist bestätigt und es gibt zwei leicht verschiedene Patches in der Bug-Eintrag, die es funktionieren.

Was passiert ist, dev_appserver.py up setzt eine eingeschränkte Python-Umgebung durch den Zugriff auf alle Nicht-System-Python-Modulen disallowing und es tut, dass durch den System Python Ordner aus der Position des os Modul berechnet wird. In einer virtualenv-Instanz wird die os.py in den virtualenv symbolisiert, aber kompiliert direkt in virtualenv, und das ist der Pfad, den dev_appserver verwendet, effektiv blockiert den Zugriff auf jedes Modul aus der System-Python-Bibliothek, die nicht von virtualend verknüpft ist, die meisten ist von ihnen. Die Lösung besteht darin, beide Wege zu "segnen".

+0

Issue 4339 wurde gerade geschlossen, behoben für SDK Version 1.6.1. Ich habe es ausprobiert und es funktioniert wieder für mich! –

1

I Denken Sie daran, da Sie virtualenv mit der Option --no-site-packages eingerichtet haben, müssen Sie das SDK in der Umgebung installieren. --no-site-packages trennen die Dev-Umgebung, die Sie konfigurieren, von jeder anderen Python-Installation auf Ihrem Computer. Wenn Sie also scheinbar konfiguriert sind, rufen Sie ein Modul auf, das nicht existiert (in der Umgebung) Warum funktioniert es mit deaktiviertem env (welches dann Python von der Standard-Betriebssysteminstallation ausführt).Versuchen Sie, das dev env ohne die Option --no-site-packages einzurichten, wenn Sie auf Module außerhalb des env zugreifen wollen.

+0

es ist üblich, --no-site-packages mit virtualenv zu haben, um eine Kontamination zu vermeiden – Lionel

2

Google AppEngine SDK macht eine Menge Trick, um seine Installation in sys.path zu ziehen, und diese Tricks beruhen auf dem tatsächlichen Dateipfad. Ich denke, es gibt viele verschiedene Gründe, warum es scheitert. SDK installiert sich nicht als echtes Python-Paket, virtualenv führt kein Sandboxing durch, es richtet nur eine Umgebung ein (offensichtlich) und ändert sys.path. Und GAE SDK tut dies auch, sie beide interessieren sich, SDK entwickelt sich schnell und ändert sich oft, so dass dies extrem holpriger Weg zu gehen ist.

Wahrscheinlich wäre es besser, wenn Sie erklären würden, was Sie erreichen möchten. Meine Vermutung ist, dass Sie versuchen, eine saubere Umgebung zu erstellen, um sicherzustellen, dass kein Drittanbieter-Modul für die Anwendung verfügbar ist. Wenn diese Vermutung richtig ist, würde ich mit der Installation von GAE SDK in virtualenv über Anforderungsdateien gehen wie beschrieben here.

0

Gleiche Antwort wie Bozzo. Hier ist eine Anleitung:

Dies ist in Issue 4339 für GAE beschrieben. Hier ist, wie es beheben:

  1. Patch herunterladen hier: patch
  2. Bewegen Sie den Patch auf google_appengine/google/appengine/tools/
  3. Ändern Sie Ihr Arbeitsverzeichnis auf dem gleichen Weg wie oben
  4. Typ: Patch -p0 < dev_appserver.patch
1

ich bin ein wenig spät, um die Konversation, aber ich hatte gerade das gleiche Problem und ich stolperte über gae_installer, die Sie in der üblichen Weise mit pip install gae_installer installieren können. Dadurch wird die Google App-Engine (gae) sdk direkt in Ihren Python-Pfad eingefügt. Hoffe andere finden das nützlich.

+0

hast du das innerhalb oder außerhalb des virtuellen env gemacht? – vlsd