Como usar o virtualenv com o SDK do Google App Engine no Mac OS X 10.6

Estou puxando meu cabelo tentando descobrir isso, porque eu estava trabalhando até a semana passada e de alguma forma quebrou.

Quando configuro um virtualenv para um aplicativo do Google App Engine e inicio o aplicativo comdev_appserver.py, Recebo erros ao importar a biblioteca padrão (como "ImportError: nenhum módulo chamado base64").

Aqui está o que estou fazendo:

(Usando o sistema Python)

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

Então eu adiciono agae.pth arquivo para~/.virtualenv/foobar/lib/python2.5/site-packages/ contendo as bibliotecas do 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

(Isso é baseado emesta resposta.)

Então, eu fonte meu virtualenv "foobar" e tento iniciar meu aplicativo comdev_appserver.py.

O servidor inicia, mas a primeira solicitação é exibida com o erro "ImportError: nenhum módulo chamado base64" mencionado acima. Se eu visito o console de administração, recebo "ImportError: No module named cgi".

Se eu iniciar o python, posso carregar esses módulos.

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

Parece que o sandbox do SDK está impedindo que essas bibliotecas sejam carregadas. Mas, como eu disse, eu estava trabalhando até a semana passada ... algo mudou ou, inadvertidamente, quebrei meu virtualenv e não consigo descobrir como consegui que isso funcionasse em primeiro lugar.

Versões de software:

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

Atualizar: Em resposta às perguntas de Alan Franzoni:

Estou usando o sistema Python que acompanha o Mac OS X. Instalei o virtualenv via easy_install. Atualizei para o virtualenv 1.5.1 hoje para tentar corrigir o problema.

Se eu correrpython /usr/local/bin/dev_appserver.py com o virtualenv python, o problema persiste. Se eu desativar o virtualenv e executar esse comando com o sistema python2.5, ele funcionará. (Além disso, posso usar o GoogleAppEngineLauncher para iniciar meu aplicativo.)

Aqui está um rastreamento de pilha completo (este usa a estrutura Kay, mas o problema é o mesmo com o 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

questionAnswers(5)

yourAnswerToTheQuestion