Как использовать virtualenv с SDK Google App Engine в Mac OS X 10.6

Я вытягиваю свои волосы, пытаясь понять это, потому что я работал до последней недели, и как-то он сломался.

Когда я настраиваю virtualenv для приложения Google App Engine и запускаю приложение с dev_appserver.py, я получаю ошибки, импортирующие стандартную библиотеку (например, "ImportError: No module named base64" ).

Вот что я делаю:

(с использованием системы Python)

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

Затем я добавляю файл gae.pth в ~/.virtualenv/foobar/lib/python2.5/site-packages/, содержащий библиотеки 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

(Это на основе этого ответа.)

Затем я отправлю свой "foobar" virtualenv и попытаюсь запустить мое приложение с dev_appserver.py.

Сервер запускает, но первые ошибки запроса выходят с вышеупомянутым "ImportError: Нет модуля с именем base64". Если я нахожусь в консоли администратора, я получаю "ImportError: No module cgi".

Если я запустил python, я могу загрузить эти модули.

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

Кажется, что песочница SDK препятствует загрузке этих библиотек. Но, как я уже сказал, у меня это работало до прошлой недели... что-то изменилось, или я непреднамеренно нарушил свой virtualenv, и я не могу понять, как я его работаю в первую очередь.

Версия программного обеспечения:

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

Обновление: В ответ на вопросы Алана Францони:

Я использую систему Python, которая поставляется с Mac OS X. Я установил virtualenv через easy_install. Сегодня я обновился до virtualenv 1.5.1, чтобы попытаться устранить проблему.

Если я запускаю python /usr/local/bin/dev_appserver.py с помощью виртуального python, проблема остается. Если я деактивирую virtualenv и запустим эту команду с помощью системы python2.5, она будет работать. (Кроме того, я могу использовать приложение GoogleAppEngineLauncher для запуска моего приложения.)

Вот полная трассировка стека (в этом используется структура Kay, но проблема такая же с 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

Ответ 1

Это issue 4339 с GAE SDK, это подтвердилось, и в записи ошибок есть две несколько разных патча, которые заставляют ее работать.

Что происходит: dev_appserver.py устанавливает ограниченную среду python, запрещая доступ к любым модулям, не относящимся к системе, и делает это, вычисляя системную папку python из местоположения модуля os. В экземпляре virtualenv os.py получает символическую связь в virtualenv, но скомпилируется непосредственно в virtualenv, и это путь, который использует dev_appserver, эффективно блокируя доступ к любому модулю из библиотеки python системы, которая не связана виртуальным доступом, что больше всего из них. Решение состоит в том, чтобы "благословить" оба пути.

Ответ 2

Google AppEngine SDK делает много трюков, чтобы вытащить свою установку в sys.path, и эти трюки полагаются на фактический путь к файлу. Я думаю, что может быть много разных причин, почему это не удается. SDK не устанавливает себя как настоящий пакет python, virtualenv не выполняет полноценную песочницу, он просто устанавливает среду (очевидно) и меняет sys.path. И GAE SDK делает это тоже, они оба intefere, SDK развивается быстро и часто меняется, поэтому это очень ухабистая дорога, чтобы идти.

Возможно, было бы лучше, если бы вы объяснили, чего вы пытаетесь достичь. Я предполагаю, что вы пытаетесь создать чистую среду, чтобы гарантировать, что сторонний модуль не доступен для приложения. Если это предположение верно, я бы пошел с установкой GAE SDK в virtualenv через файлы требований, как описано здесь.

Ответ 3

Я думаю, поскольку вы настроили virtualenv с опцией -no-site-packages, вам нужно установить SDK в среду. --no-site-packages разделяет среду разработки, которую вы настраиваете, из любой другой установки Python на вашем компьютере, поэтому, как вы, похоже, настроили ее, вы вызываете модуль, который не существует (в среде), который почему он работает с env deactivated (который затем запускает Python из установки ОС по умолчанию). Попробуйте настроить dev env без опции -no-site-packages, если вы хотите иметь доступ к модулям за пределами env.

Ответ 4

Я немного опаздываю на разговор, но у меня была такая же проблема, и я наткнулся на gae_installer, который вы можно установить обычным способом с помощью pip install gae_installer. Это поместит движок Google (gae) sdk прямо в ваш путь к python. Надеюсь, что другие считают это полезным.

Ответ 5

Тот же ответ, что и bozzo. Здесь инструкции:

Это описано в Issue 4339 для GAE. Вот как это исправить:

  • Скачать патч здесь: patch
  • Переместите патч на google_appengine/google/appengine/tools/
  • Измените рабочий каталог на тот же путь, что и выше.
  • Тип: patch -p0 < dev_appserver.patch