2010-04-26 16 views

Odpowiedz

30

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.

+0

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 –

+0

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? –

+0

@Brian: świetnie. Cieszę się, że to działa. Dodam kolejny przykład, który pozwoli ci zatrzymać import w jednym miejscu. – bernie

0

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.

5

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
1

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.