Как запустить собственный скрипт Python в движке Google App - PullRequest
1 голос
/ 16 мая 2019

Извинения за длинный подробный вопрос. Здесь идет ...

Файл имеет имя send_daily_report.py и использует некоторые библиотеки, которые подробно описаны в файле require.txt.

Мой app.yaml выглядит следующим образом:

runtime: python27
threadsafe: false

handlers:
- url: /send_daily_report
  script: send_daily_report.py

libraries:
- name: ssl
  version: latest

My cron.yaml выглядит следующим образом:

cron:
- description: "Send unsent subscriptions to Glocell rewards every 1 minute"
  url: /send_daily_report
  schedule: every 1 day from 00:00

И, наконец, мои needs.txt имеют следующее содержимое:

Babel==2.5.3
cachetools==3.1.0
certifi==2017.11.5
chardet==3.0.4
coloredlogs==8.0
colorlog==3.1.0
et-xmlfile==1.0.1
google-api-core==1.10.0
google-auth==1.6.3
google-cloud-core==0.29.1
google-cloud-storage==1.15.0
google-resumable-media==0.3.2
googleapis-common-protos==1.5.10
humanfriendly==4.6
idna==2.6
jdcal==1.3
money==1.3.0
mysql-connector-python==8.0.5
mysqlclient==1.3.12
numpy==1.16.3
openpyxl==2.5.0
pandas==0.24.2
protobuf==3.7.1
pyasn1==0.4.5
pyasn1-modules==0.2.5
python-dateutil==2.8.0
python-magic==0.4.15
pytz==2017.3
requests==2.18.4
rsa==4.0
six==1.12.0
urllib3==1.22

Когда я делаю:

gcloud app deploy app.yaml cron.yaml

кажется, что он игнорирует мой файл require.txt и не устанавливает зависимого. Я даже запускал его на сервере gcloud dev ( dev_appserver.py ./app.yaml --enable_console) локально, и библиотеки определенно не устанавливаются, когда я использую консоль dev-сервера, чтобы попытаться импортировать их.

Затем я попытался использовать Python 3.7. который на самом деле устанавливает библиотеки в файл require.txt, но проблема в app.yaml в обработчиках, я не могу указать имя скрипта. Для python 3.7 это значение всегда устанавливается на auto в соответствии с gcloud app.yaml, ссылка .

Что мне нужно сделать, чтобы выполнить мой скрипт в gcloud app engine cron. В системе Linux это была бы простая установка cronjob в crontab следующим образом:

0 0 * * * python / send_daily_py

Из того, что я читаю о Python 3.7, мне кажется, что мне нужен django или flex для обработки запросов и маршрутизации их для выполнения моего собственного сценария .py, который кажется излишним, чтобы я мог выполнить один сценарий. Неужели есть способ обойти это? Я даже попытался включить библиотеки в подпапку в папке приложения следующим образом:

pip install --upgrade -r needs.txt -t ./lib

Затем я добавил init .py в lib, а затем я изменил весь свой импорт на использование

импорт lib.name_of_library

Что не сработало, поскольку эти библиотеки впоследствии не могли импортировать необходимые им подпакеты.

**

Heeeeelp!

**

1 Ответ

1 голос
/ 16 мая 2019

App Engine - это продукт PaaS, а не IaaS (на котором вы можете просто запустить образ linux и установить упомянутый вами cron).Вы не можете запускать произвольные автономные скрипты Python в GAE.Вы можете достичь желаемого, переработав скрипт для удовлетворения требований приложений GAE - в основном сделайте функцию вызываемой из обработчика HTTP (S).

ДляСтандартное окружение 1-го поколения (среда исполнения python27):

  • файл requirements.txt не используется GAE.Как вы обнаружили, вы можете использовать его для реализации ваших зависимостей Python, но это еще не все, см. Копирование сторонней библиотеки .
  • функциональность вашего скрипта должна быть переработанакак приложение WSGI, которое вы настраиваете в своем app.yaml.От Элемент обработчиков :

Сценарий : директива должна представлять собой путь импорта python, например, package.module.app указывает на приложение WSGI.Последний компонент скрипта : директива с использованием модуля Python path - это имя глобальной переменной в модуле: эта переменная должна быть приложением WSGI и обычно называется **** по соглашению.

Примечание: как и для оператора Python import , каждый подкаталог, являющийся пакетом, должен содержать файл с именем init .py.

  • Я бы посоветовал вам пройти через Python Runtime Environment , ваш длинный список требований может не соответствует ограничениям песочницы(в частности, Pure Python one).

Для стандартной среды 2-го поколения (среда выполнения python37):

  • зависимости автоматически устанавливаются из вашегоrequirements.txt file, см. Указание зависимостей
  • только auto можно указать в операторе script: в app.yaml, поскольку само приложение указывается через конфигурацию entrypoint:,Поэтому вам нужно переделать скрипт, чтобы он вызывался в этом приложении как обработчик.От Среда выполнения и элементы приложения :

Чтобы приложение получало HTTP-запросы, точка входа должна содержать команду, запускающую прослушивающий веб-серверна порту, указанном переменной среды PORT.

Гибкая среда (с такой же переделкой, что и для стандарта 2-го поколения) могла бы подойти лучше, особенно потому, чтовы можете настроить экземпляры с большим количеством ресурсов оперативной памяти / процессора (которые вам могут потребоваться , судя по вашему файлу requirements.txt), чем в стандартной среде.

...