Как импортировать модули в Google App Engine? - PullRequest
22 голосов
/ 26 апреля 2010

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

Ответы [ 4 ]

30 голосов
/ 26 апреля 2010

Просто поместите файл 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:
Извините, я должен был упомянуть об этом ранее. Вам нужно изменить свой путь, спасибо Нику Джонсону за следующее исправление.
Убедитесь, что этот код запущен до запуска вашего приложения; как то так:

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.
Вот ссылка на полный рабочий пример на случай, если мое объяснение было неясным.

5 голосов
/ 26 апреля 2010

Я поддержу ответы, данные @ Адамом Бернье и @ С. Марком, хотя Адам объясняет вещи немного подробнее. в общем, вы можете добавить любой чистый модуль / пакет Python в каталог App Engine и использовать его как есть, если они не пытаются работать вне песочницы, то есть не могут создавать файлы, не могут открывать сетевые сокеты и т. д. .

также имейте в виду жесткие ограничения:

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

ОБНОВЛЕНИЕ (октябрь 2011 г.): большинство этих чисел были увеличены до:

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

ОБНОВЛЕНИЕ (июнь 2012 г.): последний предел был увеличен до:

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

Вы можете импортировать пакеты 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 из boto, но это может привести к странностям из-за отсутствия __init __. Py.

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

0 голосов
/ 26 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...