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.
Я не думаю, что 'lib' должен быть модулем/пакетом, он должен быть просто файлом, содержащим другие модули/пакеты (donno, если это имеет какое-либо отношение к вашей проблеме). Возможно, это хорошая идея, чтобы точно показать структуру вашего приложения и фрагменты кода, вызывающие ошибки. Также лучше показать приведенные ошибки, не описанные. Является ли ваше приложение мультимодульным? –
У вас есть последний бит с «vendor.add ('lib»), но вы должны просто «импортировать твиттер», vendor.add add на ваш путь к python, «lib» не является модулем или пакетом. –