Как импортировать модули в Google App Engine?

Я создал простое приложение GAE на основе шаблона по умолчанию. Я хочу добавить внешний модуль, например short_url. Как мне это сделать? Направления, которые я нашел до сих пор, сбивают с толку, и GAE, похоже, не использует PYTHONPATH по очевидным причинам, я думаю.

Ответ 1

Просто разместите файл short_url.py в каталоге приложения.

Пример проекта App Engine:

myapp/
    app.yaml
    index.yaml
    main.py
    short_url.py
    views.py

И в views.py (или где угодно) вы можете импортировать так:

import short_url

Для более сложных проектов, возможно, лучшим способом является создание каталога, особенно для зависимостей; скажем lib:

myapp/
    lib/
        __init__.py
        short_url.py
    app.yaml
    index.yaml
    main.py
    views.py
from lib import short_url

Изменить №2:
Извиняюсь, я должен был упомянуть об этом раньше. Вам нужно изменить свой путь, благодаря Nick Johnson для следующего исправления.
Убедитесь, что этот код запущен до запуска вашего приложения; что-то вроде этого:

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:
Чтобы этот код запускался перед всеми другими импортами, вы можете поместить код управления трафиком в собственный файл в своем базовом каталоге приложения (Python распознает все в этом каталоге без каких-либо изменений пути).
И тогда вы просто убедитесь, что этот импорт

import fix_path

... отображается перед всеми другими импортами в вашем файле main.py.
Здесь ссылка на полный рабочий пример, если мои объяснения не ясны.

Ответ 2

я отвечу ответы, полученные @Adam Bernier и @S.Mark, хотя адам объясняет, что это немного более подробно. в общем, вы можете добавить любой чистый модуль/пакет Python в свой каталог App Engine и использовать как есть, если они не пытаются работать вне песочницы, т.е. не могут создавать файлы, не могут открывать сетевые сокеты и т.д..

также следует учитывать жесткие ограничения:

  • максимальное общее количество файлов (файлов приложений и статических файлов): 3 000
  • максимальный размер файла приложения: 10 мегабайт
  • максимальный размер статического файла: 10 мегабайт
  • максимальный общий размер всех приложений и статических файлов: 150 мегабайт

UPDATE (октябрь 2011 г.): большинство из этих чисел увеличено до:

  • максимальное общее количество файлов (файлов приложений и статических файлов): 10 000
  • максимальный размер файла приложения: 32 МБ
  • максимальный размер статического файла: 32 МБ

UPDATE (июн 2012): последний предел был сбит до:

  • максимальный общий размер всех приложений и статических файлов: 1 ГБ

Ответ 3

Вы можете импортировать пакеты python в виде ZIP файлов. Это позволяет избежать максимального количества файлов.

приложение для работы с документами обращается к этому.

python 2.5: поддерживается zipimport.

python 2.7: zipimport не поддерживается, но Python 2.7 может изначально импортировать из .zip файлов.

Вот как я импортирую boto.

sys.path.insert(0, 'boto.zip')
import boto #pylint: disable=F0401
from boto import connect_fps  #pylint: disable=F0401

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

Например, boto.zip распаковывается в подкаталог "boto" с внутренним модулем "boto" (как другой подкаталог).

Итак, чтобы импортировать boto, естественно, вам придется делать с boto import boto, но это может вызвать странность с отсутствием __init __. py.

Чтобы решить эту проблему, просто распакуйте и заархивируйте вложенную папку boto вручную как boto.zip и поместите ее в папку приложения.

Ответ 4

Начиная с этой программы url_shortener, написанной на python, вы можете просто включить в свой исходный код и импортировать ее, как и другие модули python.