GAE – Включает внешние модули python без добавления их в репозиторий?

В настоящее время я работаю над проектом Google App Engine на основе python. В частности, я использую Flask для приложения. Мне интересно, какой приемлемый метод включения внешних модулей python, особенно когда речь заходит о репозитории. Из того, что я могу сказать, включая код других людей в моем репозитории, является плохая форма по нескольким причинам. Тем не менее, другие люди будут работать в одном хранилище, поэтому мы должны использовать одни и те же внешние модули для обеспечения тех же результатов.

В частности, мне нужно включить Flask (и его зависимости) в мое приложение. Самый простой способ сделать это с помощью Google App Engine – просто выбросить их на корневой уровень:

MyProject app.yaml main.py MyApp Flask ... 

Каким образом можно задействовать эти внешние модули в таком проекте? Было бы полезно и обобщенный ответ, и один конкретный для моего дела. Кроме того, будут приветствоваться любые другие соответствующие рекомендации. Спасибо много.

4 Solutions collect form web for “GAE – Включает внешние модули python без добавления их в репозиторий?”

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

  1. Если библиотека сторонних разработчиков выпускает новую версию, которая нарушает функциональность, вам придется либо внести все необходимые изменения в соответствие с новыми требованиями, либо просто найти предыдущую версию, чтобы продолжить работу и нарушить внешнее соединение. Обычно это происходит, когда вы очень близки к предельным срокам.

  2. Если сторонняя библиотека выпустит новую версию, а один из ваших коллег будет обновлен и внесет все необходимые изменения в поддержку новой версии, на вашей стороне код будет сломан, пока вы не обновите его.

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

Ваш лучший вариант – включить внешние библиотеки в ваш репозиторий, что также имеет то преимущество, что вы можете запустить и запустить весь проект на новом компьютере без многих зависимостей. Существует множество способов организации ваших сторонних библиотек, и все они должны быть включены на одном или более уровне с вашим файлом app.yaml . Так же, как упомянутый @dragonx, включает только код основной библиотеки.

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

Поскольку вы упомянули Flask в Google App Engine, вы можете проверить мой проект gae-init , где вы можете увидеть на практике, как организованы внешние библиотеки .

Здесь вы задаете два вопроса.

  1. Как включить внешнюю библиотеку в мой проект GAE?

У тебя есть правильная идея. Каким бы способом вы ни занимались, вы должны каким-то образом включить Flask и его зависимости в корень вашего проекта GAE. Один из способов – разместить копию прямо там.

Второй способ – использовать символическую ссылку на папку, содержащую внешнюю библиотеку. Я не уверен в Flask, но часто временные репозитории содержат фактический код библиотеки в подкаталоге – так часто вам не нужен корень репо в вашем приложении GAE, а только корень реального источника. В этом случае проще разместить символическую ссылку, которая ссылается на исходную папку.

  1. Как управлять внешними библиотеками в моем исходном репо?

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

Если вы используете git, git submodule – это путь. С этим немного запутаться, но он выполнит свою работу.

Я бы рекомендовал структуру репо, которая выглядит примерно так:

 repo/ thirdparty/ flask/ other_dependency/ another_dependency/ README.TXT setup.py src/ app/ app.yaml your_source.py softlink_to_flask softlink_to_other_dependency softlink_to_another_dependency_src 

В этом примере вы храните источник в своих внешних библиотеках в папке thirdparty. Это могут быть git-подмодули. В папке приложения у вас есть источник и программные ссылки на соответствующие файлы, которые действительно необходимы для запуска вашего приложения. В этом случае фактический код для другой_зависимости может быть в папке another_dependency / src, а не в фактическом корне другой зависимости. Таким образом, вам не нужно включать ненужные файлы в папку развертывания, но вы все равно можете сохранить всю библиотеку в своем репо.

Вы не можете просто создать requirements.txt и поместить его в GAE. Ваш код должен включать все чистые библиотеки python, которые использовали ваш проект, и не поддерживается GAE ( https://developers.google.com/appengine/docs/python/tools/libraries27 ).

Если вы посмотрите пример развертывания фляги для GAE ( http://flask.pocoo.org/docs/quickstart/#deploying-to-a-web-server и https://github.com/kamalgill/flask-appengine-template ) вы можете найти некоторые зависимости, такие как flask , werkzeug и т. д. и все эти зависимости, которые вы должны нажать на сервер GAE.

Поэтому я вижу три решения:

  1. Используйте локальные требования для локальной разработки и создайте функцию пользовательской сборки, которая загрузит все зависимости, разместит с вашим приложением и загрузит их на сервер GAE.

  2. Добавьте инструменты для локального развертывания, когда вы только начинаете проект, который помещает необходимые библиотеки в ваше приложение (не забывайте о .gitignore ).

  3. Используйте что-то вроде git submodules в репозитории требований.

Существует два случая использования пакетов сторонних разработчиков python в проекте движка Google:

Если ваша библиотека является одной из поддерживаемых во время выполнения сторонних библиотек раздела GAE

просто добавьте его в свой файл app.yml в библиотеках

  libraries: - name: package_name version: latest 

Добавьте свой код

 import pack_name 

Иногда вам необходимо установить пакет с

 pip install package_name 

Убедитесь, что вы используете правильный интерпретатор, используя

 pip freeze 

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

В противном случае, если GAE не поддерживает вашу библиотеку , вам необходимо загрузить ее вручную и сохранить ее локально в каталоге root / Lib: или через GIT или через pip (pip install package_name -t path / to / your / Lib / dir)

После этого мы должны объявить каталог Lib в качестве исходного каталога в pycharm pycharm-> preferences-> Project Structure Выберите каталог Lib и пометьте его как источник.
Затем импортируйте его.

 import pack_name 

Обратите внимание, что когда вы делаете импорт, вы выбираете локальный путь, а не ваш путь к python.

В общем, рекомендуется иметь файл требований. Txt, который включает все имена используемых пакетов, а затем pycharm распознает удаленные пакеты и предложит их установить.

Удачи

  • Как использовать сеанс в Google приложении
  • Определение общих файлов для проектов GAE
  • Использование двух библиотек Python с конфликтующими именами
  • Каков синтаксис добавления параметра GET в URL? питон; движок Google
  • Как получить изображение и сохранить в blobstore?
  • Пиратский движок Google App, пишущий csv на арабском языке
  • Как работают очереди задач Google App Engine?
  • Проблемы с производительностью memcache App Engine / ndb.get_multi
  • Python - лучший язык программирования в мире.