2010-10-04 18 views
30

Mi sto tirando fuori i capelli cercando di capirlo perché l'ho fatto funzionare fino alla scorsa settimana e in qualche modo si è rotto.Come utilizzare virtualenv con Google App Engine SDK su Mac OS X 10.6

Quando imposto una virtualenv per un'app di Google App Engine e avvio l'app con dev_appserver.py, ottengo errori durante l'importazione della libreria standard (come "ImportError: No module named64").

Ecco quello che sto facendo:

(Usando il sistema di Python)

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

poi aggiungo le a gae.pth di file a ~/.virtualenv/foobar/lib/python2.5/site-packages/ contenente le librerie 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 

(basato su this answer.)

Quindi viene il mio virtualenv "foobar" e provo ad avviare la mia app con dev_appserver.py.

Il server si avvia ma la prima richiesta presenta errori con il già citato "ImportError: nessun modulo denominato base64". Se visito la console di amministrazione ottengo "ImportError: nessun modulo chiamato cgi".

Se avvio python, posso caricare questi moduli.

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

Sembra che il sandboxing dell'SDK impedisca il caricamento di queste librerie. Ma come ho detto, ho lavorato fino alla scorsa settimana ... qualcosa è cambiato o ho inavvertitamente rotto la mia virtualità e non riesco a capire come ho fatto a funzionare in primo luogo.

versioni del software:

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

Aggiornamento: In risposta alle domande di Alan Franzoni:

Sto usando il sistema Python fornito con Mac OS X. Ho installato virtualenv tramite easy_install. Ho aggiornato oggi a virtualenv 1.5.1 per provare a risolvere il problema.

Se corro python /usr/local/bin/dev_appserver.py con python virtualenv, il problema persiste. Se disattivo virtualenv ed eseguo quel comando con il sistema python2.5, funziona. (. Inoltre, posso uso il GoogleAppEngineLauncher per iniziare la mia app)

Ecco una traccia stack completo (questo uno utilizza il framework Kay, ma il problema è lo stesso 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 
+0

La prego di tagliare e incollare l'output completo per tale errore? Se usi "python /usr/local/bin/dev_appserver.py" l'errore rimane lo stesso? Inoltre, come hai installato virtualenv, tramite setuptools? E stai usando il sistema python2.5, Macports One, qualsiasi combinazione di quelli? –

+0

Grazie per la risposta. Ho aggiornato il post per rispondere alle tue domande. –

+0

Puoi digitare "which python" per assicurarti di eseguire virtualenv Python? – varikin

risposta

15

È un issue 4339 con l'SDK GAE, è confermato e ci sono due patch leggermente diverse disponibili nella voce del bug che lo fanno funzionare.

Cosa accade è dev_appserver.py allestisce un ambiente ristretto pitone non consentendo l'accesso a tutti i moduli non-system-pitone e lo fa calcolando la cartella di sistema pitone dalla posizione del modulo os. In un'istanza virtualenv il os.py ottiene un collegamento simbolico nel virtualenv ma ottiene compilato direttamente in virtualenv, e questo è il percorso che dev_appserver utilizza, bloccando efficacemente l'accesso a qualsiasi modulo dalla libreria python di sistema che non è collegata da virtualend, che è la maggior parte di loro. La soluzione è "benedire" entrambi i percorsi.

+0

Il problema 4339 è stato appena chiuso come Fisso per SDK versione 1.6.1. L'ho provato e funziona ancora per me! –

1

I pensa che, dato che hai configurato virtualenv con l'opzione --no-site-packages, devi installare l'SDK nell'ambiente. --no-site-packages separa l'ambiente di sviluppo che stai configurando da qualsiasi altra installazione di Python sul tuo computer in modo che, come sembra averlo configurato, stai chiamando un modulo che non esiste (nell'ambiente) che è perché funziona con env disattivato (che quindi esegue Python dall'installazione del sistema operativo predefinito).Prova a configurare l'ambiente di sviluppo senza l'opzione --no-site-packages se vuoi essere in grado di accedere ai moduli al di fuori dell'env.

+0

è comune avere --no-site-packages con virtualenv per evitare la contaminazione – Lionel

2

Google AppEngine SDK fa un sacco di trucco per tirare la sua installazione in sys.path, e questi trucchi si basano sul percorso del file vero e proprio. Penso che potrebbero esserci molti motivi per cui fallisce. SDK non si installa come un vero pacchetto Python, virtualenv non completa il sandboxing, semplicemente imposta un ambiente (ovviamente) e cambia sys.path. E anche l'SDK di GAE fa questo, entrambi intralciano, l'SDK si sta sviluppando rapidamente e sta cambiando spesso, quindi questa è una strada estremamente accidentata.

Probabilmente, sarebbe meglio se ti spieghi che cosa stai cercando di ottenere. La mia ipotesi è che si stia tentando di creare un ambiente pulito per garantire che nessun modulo di terze parti sia disponibile per l'applicazione. Se questa ipotesi è corretta, andrei con l'installazione di GAE SDK in virtualenv tramite i file dei requisiti come descritto in here.

0

Stessa risposta come Bozzo. Qui di istruzioni:

Questo è descritto in Issue 4339 per GAE. Ecco come risolvere il problema:

  1. download di patch qui: patch
  2. Spostare la patch per google_appengine/Google/AppEngine/strumenti/
  3. Cambia la directory di lavoro per lo stesso percorso come sopra
  4. tipo: patch -p0 < dev_appserver.patch
1

sono un po 'tardi per la conversazione, ma stavo solo avendo lo stesso problema e mi sono imbattuto in gae_installer, che è possibile installare nel solito modo con pip install gae_installer. Questo inserirà il motore dell'app google (gae) sdk direttamente nel tuo percorso python. Spero che gli altri trovino questo utile.

+0

hai fatto questo dentro o fuori l'ambiente virtuale? – vlsd

Problemi correlati