Stworzyłem prostą aplikację GAE opartą na domyślnym szablonie. Chcę dodać moduł zewnętrzny, taki jak short_url. Jak mam to zrobic? Wskazówki, które do tej pory znalazłem, są mylące, a GAE nie wydaje się używać PYTHONPATH z oczywistych powodów, jak sądzę.Jak importować moduły w Google App Engine?
Odpowiedz
Wystarczy umieścić plik short_url.py
w katalogu swojej aplikacji.
Przykładowy projekt App Engine:
myapp/ app.yaml index.yaml main.py short_url.py views.py
I views.py
(lub gdziekolwiek), można następnie zaimportować tak:
import short_url
Dla bardziej złożonych projektów, być może lepszą metodę jest stworzenie katalogu szczególnie dla zależności; powiedzieć lib
:
myapp/ lib/ __init__.py short_url.py app.yaml index.yaml main.py views.py
from lib import short_url
Edit # 2:
Przepraszamy, powinienem wspomnieć o tym wcześniej. Musisz zmodyfikować swoją ścieżkę, dzięki Nick Johnson dla następnej poprawki.
Upewnij się, że ten kod jest uruchamiany przed uruchomieniem aplikacji; coś takiego:
import os
import sys
def fix_path():
# credit: Nick Johnson of Google
sys.path.append(os.path.join(os.path.dirname(__file__), 'lib'))
def main():
url_map = [ ('/', views.IndexHandler),] # etc.
app = webapp.WSGIApplication(url_map, debug=False)
wsgiref.handlers.CGIHandler().run(app)
if __name__ == "__main__":
fix_path()
main()
Edit3:
Aby uzyskać ten kod do uruchomienia przed wszystkimi innymi importu, można umieścić ścieżkę zarządzający kod w pliku własnych w katalogu głównym swojej aplikacji (Python rozpoznaje wszystko w tym katalogu bez żadnych modyfikacji ścieżek).
A potem po prostu upewnić się, że ten import
import fix_path
... jest wymienione przed wszystkimi innymi importu w pliku main.py
.
Oto link to full, working example na wypadek, gdyby moje wyjaśnienie nie było jasne.
Od tego programu url_shortener napisanego w pythonie można po prostu dołączyć kod źródłowy i zaimportować go tak, jak inne moduły Pythona.
Będę drugi odpowiedzi udzielonych przez @ Adam Bernier i @ S. Mark, chociaż wyjaśnia Adam rzeczy jest nieco więcej szczegółów. Ogólnie, możesz dodać dowolny czysty moduł/pakiet Pythona do swojego katalogu App Engine i używać tego typu, o ile nie próbują pracować poza piaskownicą, tzn. nie mogą tworzyć plików, nie mogą otwierać gniazd sieciowych itp. .
Należy także pamiętać, twarde limity:
- Maksymalna łączna liczba plików (pliki aplikacji i plików statycznych): 3000
- Maksymalny rozmiar pliku aplikacji: 10 megabajtów
- Maksymalny rozmiar plik statyczny: 10 megabajtów
- maksymalny całkowity rozmiar wszystkich aplikacji i plików statycznych: 150 megabajty
UPDATE (październik 2011): większość z tych liczb have been increased do:
- Maksymalna łączna liczba plików (pliki aplikacji i plików statycznych): 10,000
- Maksymalny rozmiar pliku aplikacji: 32MB
- maksymalnej wielkości plik statyczny: 32MB
UPDATE (cze 2012): ostatnia granica was bumped up do:
- maksymalna całkowita wielkość wszystkich plików aplikacji i statycznych: 1 GB
Możesz importować pakiety Pythona jako ZIP. Pozwala to uniknąć maksymalnej liczby plików.
Adres ten należy adresować pod numerem .
python 2.5: zipimport is supported.
python 2.7: zipimport is not supported, but Python 2.7 can natively import from .zip files.
W ten sposób importuję boto.
sys.path.insert(0, 'boto.zip')
import boto #pylint: disable=F0401
from boto import connect_fps #pylint: disable=F0401
Wady tej techniki obejmują konieczność ręcznego ponownego archiwizowania wielu pakietów.
Na przykład boto.zip rozpakowuje się do podkatalogu "boto", z modułem "boto" wewnątrz (jako inny podkatalog).
Tak więc, aby importować boto naturalnie, może trzeba zrobić z boto import boto, ale może to powodować dziwność z brakiem __init__.py.
Aby rozwiązać ten problem, wystarczy rozpakować i zarchiwizować podfolder boto ręcznie jako plik boto.zip i umieścić go w folderze aplikacji.
- 1. Google App Engine APNS
- 2. web.py w Google App Engine
- 3. Retrolambda w Google App Engine
- 4. Google App Engine Geohashing
- 5. Google App Engine
- 6. Google App Engine: get_or_create()?
- 7. Moduły Python App Engine i usługa kanału
- 8. mlpy, numpy, scipy w Google App Engine
- 9. Google App Engine wiele regionów
- 10. OpenID dla Google App Engine
- 11. Google App Engine kopiowanie nadawcy
- 12. Google App Engine dziwne opóźnienie
- 13. Google App Engine vs WebFaction
- 14. Google App Engine JDO 3
- 15. Google App Engine modifyThreadGroup problemem
- 16. Google App Engine Konwerter PDF
- 17. Google App Engine: Kontyngent Błąd
- 18. Google App Engine/_ah/zdrowie
- 19. Google Cloud Datastore vs Google App Engine
- 20. Google App Engine lub Django?
- 21. Jak odinstalować pakiet SDK Google App Engine
- 22. Jak szybki jest Google App Engine?
- 23. yaml w Google App Engine z index.html
- 24. Budowanie formularza Ajax w Google App Engine
- 25. Co _ znaczy w Google App Engine?
- 26. Przesyłanie plików w Google App Engine
- 27. Przekierowanie HTML 301 w Google App Engine
- 28. Pomiar w usłudze Google App Engine
- 29. Przechowywanie danych w aplikacji Google App Engine
- 30. Grupy podmiotów w Google App Engine Datastore
Ciągle pojawia się problem, nawet po ponownym uruchomieniu serwera aplikacji przy użyciu tego układu. from lib import short_url ImportError: Brak modułu o nazwie lib –
Dzięki - teraz działa. Gdzie jest najlepsze miejsce do wywołania metody fix_path()? Dzwonię to w ten sposób: jeśli __name__ == '__main__': fix_path() main() A potem mam tej funkcji o nazwie z mojego kodu: def generate_key (id): import SHORT_URL return short_url.encode_url (id) Czy jest coś, co mogę wywołać fix_path(), która pozwala ci trzymać wszystkie importy razem na górze pliku? –
@Brian: świetnie. Cieszę się, że to działa. Dodam kolejny przykład, który pozwoli ci zatrzymać import w jednym miejscu. – bernie