2010-10-04 12 views
30

Wyciągam włosy, próbując to zrozumieć, ponieważ pracowałem do zeszłego tygodnia i jakoś się zepsuło.Jak korzystać z virtualenv z pakietem SDK Google App Engine w systemie Mac OS X 10.6

Po skonfigurowaniu virtualenv dla aplikacji Google App Engine i uruchomieniu aplikacji pod numerem dev_appserver.py, pojawiają się błędy podczas importowania biblioteki standardowej (np. "ImportError: No module named base64").

Oto co robię:

(Korzystanie z systemu Pythona)

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

Potem dodać do gae.pth plik do ~/.virtualenv/foobar/lib/python2.5/site-packages/ zawierające Google App bibliotek silnika:

/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 

(Oparte na this answer.)

Następnie źródła mojego "foobar" virtualenv i spróbuj uruchomić moją aplikację z dev_appserver.py.

Serwer uruchamia się, ale pierwsze zgłoszenie błędu powoduje błąd z powodu wspomnianego "ImportError: Brak modułu o nazwie base64". Jeśli odwiedzę konsolę administracyjną, otrzymam "ImportError: No module named cgi".

Jeśli uruchomię pytona, będę mógł załadować te moduły.

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

Wygląda na to, że piaskownica SDK uniemożliwia załadowanie tych bibliotek. Ale tak jak powiedziałem, pracowałem do zeszłego tygodnia ... coś się zmieniło albo przypadkowo złamałem moje virtualenv i nie mogę się zorientować, jak to działa.

wersje oprogramowania:

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

Aktualizacja: W odpowiedzi na pytania Alana FRANZONI za:

Używam systemu Python dostarczonego z systemem Mac OS X. Zainstalowałem virtualenv przez easy_install. Zaktualizowałem dzisiaj do wersji virtualenv 1.5.1, aby spróbować rozwiązać problem.

Jeśli uruchomię python /usr/local/bin/dev_appserver.py z pythonem virtualenv, problem będzie nadal występował. Jeśli dezaktywuję virtualenv i uruchomię to polecenie w systemie python2.5, to działa. (. Również mogę używać GoogleAppEngineLauncher rozpocząć mój app)

Oto pełna ślad stosu (ta wykorzystuje ramy Kay, ale problem jest taki sam z 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

Czy możesz wyciąć i wkleić pełne dane wyjściowe dla takiego błędu? Jeśli używasz "python /usr/local/bin/dev_appserver.py", czy błąd pozostaje taki sam? W jaki sposób zainstalowałeś virtualenv za pomocą setuptools? Czy używasz systemu python2.5, Macports One, jakiejkolwiek kombinacji tych? –

+0

Dzięki za odpowiedź. Zaktualizowałem post, aby odpowiedzieć na Twoje pytania. –

+0

Czy możesz wpisać "który python", aby upewnić się, że używasz Python virtualenv? – varikin

Odpowiedz

15

Jest to issue 4339 z zestawem SDK GAE, zostało to potwierdzone i istnieją dwa nieznacznie różne poprawki dostępne w zgłoszeniu błędu, które sprawiają, że działa.

Co się stanie konfiguruje ograniczone środowisko python, uniemożliwiając dostęp do wszelkich modułów nie-systemowych Pythona i robi to przez obliczenie systemowego folderu Pythona z lokalizacji modułu os. W instancji virtualenv, os.py dostaje dowiązanie symboliczne do virtualenv, ale dostaje skompilowany prosto do virtualenv, a jest to ścieżka używana przez dev_appserver, skutecznie blokująca dostęp do dowolnego modułu z systemowej biblioteki python, która nie jest połączona przez virtualend, który jest najbardziej z nich. Rozwiązaniem jest "błogosławić" obie ścieżki.

+0

Problem 4339 został właśnie zamknięty jako Naprawiono dla wersji SDK 1.6.1. Wypróbowałem to i znowu działa dla mnie! –

1

I myślę, ponieważ konfigurujesz virtualenv z opcją --no-site-packages, musisz zainstalować SDK w środowisku. --no-site-packages oddziela środowisko deweloperskie, które konfigurujesz, z dowolnej innej instalacji Pythona na twoim komputerze, więc, jak wydajesz się mieć skonfigurowane, dzwonisz do modułu, który nie istnieje (w środowisku), który jest dlaczego działa z wyłączonym env (który następnie uruchamia Python z domyślnej instalacji systemu operacyjnego).Spróbuj skonfigurować dev env bez opcji --no-site-packages, jeśli chcesz mieć dostęp do modułów spoza env.

+0

często występują pakiety -no-site z virtualenv w celu uniknięcia kontaminacji. – Lionel

2

Aplikacja Google AppEngine SDK wykonuje wiele sztuczek, aby pobrać swoją instalację do sys.path, a te sztuczki polegają na rzeczywistej ścieżce pliku. Myślę, że może być wiele różnych powodów, dla których zawodzi. SDK nie instaluje się jako prawdziwy pakiet Pythona, virtualenv nie wykonuje pełnej piaskownicy, tylko tworzy środowisko (oczywiście) i zmienia sys.path. A także SDK GAE to robi, oba są nieskoordynowane, SDK rozwija się szybko i często się zmienia, więc jest to bardzo wyboista droga do zrobienia.

Prawdopodobnie byłoby lepiej, gdybyś wyjaśnił, co próbujesz osiągnąć. Domyślam się, że próbujesz stworzyć czyste środowisko, aby żaden moduł zewnętrzny nie był dostępny dla aplikacji. Jeśli to przypuszczenie jest poprawne, chciałbym zainstalować pakiet GAE SDK w virtualenv za pomocą plików wymagań, jak opisano w here.

0

Ta sama odpowiedź co w przypadku bozzo. Oto instrukcje:

Jest to opisane w Issue 4339 dla GAE. Oto jak to naprawić:

  1. Pobierz łatkę tutaj: patch
  2. Move łatka do google_appengine/Google/AppEngine/Narzędzia/
  3. Zmień swój katalog roboczy na tej samej ścieżce, jak wyżej
  4. Typ: łata -p0 < dev_appserver.patch
1

Jestem trochę późno do rozmowę, ale miałem tylko ten sam problem i natknąłem się na gae_installer, który można zainstalować w zwykły sposób przy pomocy pip install gae_installer. Spowoduje to umieszczenie sdk silnika aplikacji Google (gae) bezpośrednio w ścieżce python. Mam nadzieję, że inni uznają to za przydatne.

+0

zrobiłeś to wewnątrz wirtualnego środowiska lub poza nim? – vlsd

Powiązane problemy