2016-01-07 5 views
1

я получаю ImportError: модуль не назвал щебет, когда он находится в моем Lib модульgoogle app engine - как добавить папку lib?

Детали:

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

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

from google.appengine.ext import vendor 

# Add any libraries installed in the "lib" folder. 
vendor.add('lib') 

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

Теперь что?

+0

Я не думаю, что 'lib' должен быть модулем/пакетом, он должен быть просто файлом, содержащим другие модули/пакеты (donno, если это имеет какое-либо отношение к вашей проблеме). Возможно, это хорошая идея, чтобы точно показать структуру вашего приложения и фрагменты кода, вызывающие ошибки. Также лучше показать приведенные ошибки, не описанные. Является ли ваше приложение мультимодульным? –

+0

У вас есть последний бит с «vendor.add ('lib»), но вы должны просто «импортировать твиттер», vendor.add add на ваш путь к python, «lib» не является модулем или пакетом. –

ответ

8

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. Вы можете просмотреть список доступных библиотек here. Для любых других зависимостей (которые могут быть только чистыми библиотеками 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 - это произвольное имя, но мы обычно выбираем по соглашению.

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

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

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

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

  • appengine_config.py будет работать в среде GAE или при запуске dev_appserver, который эмулирует среду GAE. Однако, если вы когда-либо работаете за пределами среды GAE, убедитесь, что ваш PYTHONPATH включает в себя папку lib, с которой вы хотите импортировать.
  • Поскольку вы можете использовать библиотеки поставщиков с помощью pip, вы можете спросить, почему бы вам включить зависимость с помощью app.yaml? Ответ заключается в том, что, поскольку можно использовать только чистые библиотеки Python, вы все равно должны использовать зависимости app.yaml для любых библиотек, которым нужны библиотеки C, такие как MySQL.
  • Если у вас есть библиотеки и библиотеки app.yaml, вам не нужны библиотеки поставщиков, которые будут находиться в изолированной программной среде GAE, так как версии могут конфликтовать. В этом случае неплохо иметь отдельный файл требований. Txt для зависимостей, которые вы хотите предоставить поставщику, а зависимости, которые вы хотите включить, только при запуске локально, но это GAE будет предоставлять в изолированной программной среде. Here - пример этого для MySQL.
+0

В чем разница между 'pip install -r requirements.txt -t lib' и перемещением в папку lib и выполнение' pip install -t. '? –

+0

Два отличия. Во-первых, вы не используете файл requirements.txt, поэтому, если новый разработчик клонирует ваше репо, как они знают, что устанавливать? Требование .txt - стандартный способ перечислить все зависимости, необходимые для запуска проекта. Второе различие заключается в том, что вы устанавливаете в текущий каталог (.) Вместо lib /. Это, вероятно, упрощает вам все, потому что вам не нужно вообще изменять путь импорта, используя расширение поставщика. Это нормально, если вы предпочитаете это, но цель папки lib - чистое разделение, какие модули являются сторонними. –

+0

Я только что заметил, что вы сказали «перейдите в папку lib». В этом случае нет никакой разницы в структуре папок или необходимости настройки пути импорта. Вы просто устанавливаете в lib из другого каталога. –

0
  1. Создайте папку с именем "ЛИЭС" (в домашнем каталоге вашего веб-приложение)
  2. Если одна библиотека, то просто: пип установить -t LIBS/your_library_name
  3. если несколько библиотек, сделать : pip freeze> требования..txt, пункт установить -r -t requirements.txt ЛИЭС
  4. Теперь создайте файл под названием appengine_config.py (в домашнем каталоге, опять же)
  5. В указанном файле, добавьте: из google.appengine.ext импорт поставщик vendor.add («LIBS»)

Эти получить загружен на среду двигателя приложения, и вы будете иметь возможность запускать его!