google app engine – как добавить папку lib?

Я продолжаю получать ImportError: нет модуля с именем twitter, когда он находится в моем модуле lib

Детали:

  1. модуль twitter находится в каталоге lib.
  2. В каталоге lib есть пустой init .py
  3. Я получаю сообщение об ошибке на странице, находящейся вне каталога
  4. Когда я беру модуль twitter из каталога lib и просто говорю «import twitter», он работает
  5. Когда я добавляю модуль twitter в библиотеку lib и говорю из lib import twitter, или когда я говорю об импортировании твиттера или говорю об импорте lib.twitter, он говорит, перейдите к **** и понравится
  6. Я попытался сделать это: https://cloud.google.com/appengine/docs/python/tools/libraries27?hl=ru , который предлагает:

Чтобы сообщить вашему приложению, как найти библиотеки в этом каталоге, создайте (или измените) файл с именем appengine_config.py в корневом каталоге вашего проекта, затем добавьте следующие строки:

from google.appengine.ext import vendor # Add any libraries installed in the "lib" folder. vendor.add('lib') 

а затем попытался импортировать твиттер и попробовал из lib import twitter, и он говорит: «Ха-ха, приятно попробовать».

Что теперь?

tl; dr – комментарии правильные. 'lib' не является модулем, это папка, содержащая модули. Он должен находиться на пути импорта Python до вашего import twitter , используя vendor.add('lib') , который должен правильно настроить путь импорта при развертывании или использовании dev_appserver.py. Если вы поместите vendor.add(lib) в файл appengine_config.py и запустите dev_appserver.py или разверните его, а модуль twitter внутри lib , вы сможете import twitter . Если вы работаете за пределами App Engine / devappserver, вам нужно убедиться, что lib находится на PYTHONPATH.

Ниже приведено более подробное объяснение того, что такое папка lib , что такое поставщик и как они вписываются в более общую картину управления зависимостями в App Engine.

С App Engine вы можете указать некоторые зависимости, предоставляемые песочницей в app.yaml. Здесь вы можете найти список доступных библиотек. Для любых других зависимостей (которые могут быть только чистыми библиотеками Python) библиотеки должны быть непосредственно включены в ваш проект. Непосредственно включив код для этих зависимостей в качестве части вашего проекта (а не просто перечисляя их в файле требований.txt и ожидая, что они будут установлены во время развертывания) обычно называют «вендоров».

Теперь, несмотря на то, что мы включаем зависимости напрямую, мы скорее просто используем pip и файл требований.txt по нескольким причинам, о которых я расскажу ниже. Но pip обычно используется для установки в библиотеки в системные библиотеки или virtualenv, а не в сам проект. Таким образом, функция была добавлена ​​в pip, и в App Engine была добавлена ​​функция, чтобы исправить это.

Возможности pip устанавливают зависимости в папку, а не на ваши системные библиотеки или virtualenv. Вы используете флаг -t следующим образом:

 pip install -r requirements.txt -t lib 

Где 'lib' – это папка для установки. Таким образом, вы все еще указываете свои зависимости в файле требований.txt и используете pip для их установки, они просто устанавливаются прямо в указанный каталог. Как отмечалось в комментариях, папка lib сама по себе не является модулем – она ​​просто содержит их. Таким образом, ваша папка lib не должна иметь init .py, она должна содержать только такую ​​папку, как «twitter», которая имеет init .py. Поскольку lib не является модулем, from lib import twitter самом деле не имеет смысла. Также обратите внимание, что lib – это произвольное имя, но мы обычно выбираем по соглашению.

Есть несколько больших преимуществ для поставщиков, использующих pip, а не просто для загрузки вручную зависимостей и добавления их в проект. Одно из преимуществ заключается в том, что вам не нужно проверять зависимости в исходном элементе управления – просто добавьте файл требований.txt и попросите других пользователей использовать команду pip -t для поставщиков зависимостей. Другим преимуществом является просто более организованное, чтобы чисто отделить ваш код от сторонних модулей. Суть функций поставщика заключается в том, чтобы сохранить эти преимущества, сохраняя при этом требования App Engine, чтобы включить зависимости в каталог во время развертывания.

Расширение поставщика App Engine, которое вы используете, было сделано для распознавания того, что папка содержит модули, которые были «проданы» и добавили ее в путь. Это расширение поставщика, которое вы используете в своем фрагменте. Это гарантирует, что папка lib находится на пути импорта, чтобы вы могли импортировать модули, которые вы установили в нее.

После запуска команды vendor.add вы должны будете импортировать свои модули в папку lib. Как отмечает комментарий, вам нужно убедиться, что он работает до import twitter . Хорошая практика заключается в том, чтобы убедиться, что команды поставщика выполняются раньше всего. Вы можете выполнить это, поместив этот код внутри файла с именем appengine_config.py в свой каталог. Это специальный файл, который запускается раньше всего. Взгляните на пример этого.

Несколько последних замечаний, которые могут быть полезны:

  • appengine_config.py запускается в среде GAE или при запуске dev_appserver, который эмулирует среду GAE. Однако, если вы когда-либо работаете за пределами среды GAE, убедитесь, что ваш PYTHONPATH включает папку lib вы хотите импортировать.
  • Поскольку вы можете использовать библиотеки поставщиков, используя pip, вы можете спросить, почему бы вам включить зависимость, используя app.yaml? Ответ заключается в том, что, поскольку можно использовать только чистые библиотеки Python, вы все равно должны использовать зависимости app.yaml для любых библиотек, которым нужны библиотеки C, такие как MySQL.
  • Если у вас есть выпущенные библиотеки и библиотеки app.yaml, вы не хотите продавать библиотеки, которые будут находиться в изолированной программной среде GAE, так как версии могут конфликтовать. В этом случае неплохо иметь отдельный файл требований. Txt для зависимостей, которые вы хотите предоставить поставщику, а зависимости, которые вы хотите включить, только при запуске локально, но это GAE будет предоставлять в изолированной программной среде. Вот пример этого для MySQL.
  1. Создайте папку под названием «libs» (в домашнем каталоге вашего webapp)
  2. Если одна библиотека, то просто выполните: pip install -t libs / your_library_name
  3. если несколько библиотек, выполните: pip freeze> requirements.txt, pip install -r requirements.txt -t libs
  4. Теперь создайте файл appengine_config.py (снова в домашнем каталоге)
  5. В вышеприведенном файле добавьте: from google.appengine.ext import vendor vendor.add ('libs')

Они загружаются в среду вашего приложения, и вы сможете ее запустить!