Как использовать virtualenv с Google App Engine SDK в Mac OS X 10.6 - PullRequest
30 голосов
/ 05 октября 2010

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

Когда я настраиваю virtualenv для приложения Google App Engine и запускаю приложение с dev_appserver.py, я получаю ошибки при импорте стандартной библиотеки (например, «ImportError: Нет модуля с именем 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: Нет модуля с именем 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, проблема сохраняется.Если я деактивирую virtualenv и запускаю эту команду с системой python2.5, она работает.(Кроме того, я могу использовать GoogleAppEngineLauncher для запуска моего приложения.)

Вот полная трассировка стека (в этом используется платформа Kay, но проблема та же с веб-приложением):

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

Ответы [ 5 ]

15 голосов
/ 29 марта 2011

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

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

2 голосов
/ 19 октября 2010

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

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

1 голос
/ 25 июня 2015

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

1 голос
/ 07 октября 2010

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

0 голосов
/ 19 июля 2011

Тот же ответ, что и Боззо. Вот инструкции:

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

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