Я создал простое приложение GAE на основе шаблона по умолчанию. Я хочу добавить внешний модуль, например short_url. Как мне это сделать? Направления, которые я нашел до сих пор, сбивают с толку, и GAE, похоже, не использует PYTHONPATH по очевидным причинам, я думаю.
Как импортировать модули в Google App Engine?
Ответ 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.