如何在Google App引擎中运行自定义python脚本

时间:2019-05-16 00:00:28

标签: python google-app-engine cron pip gcloud

很长的问题很抱歉。来...

该文件的名称为send_daily_report.py,并使用一些在requirements.txt文件中详细介绍的库。

我的 app.yaml 如下:

runtime: python27
threadsafe: false

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

libraries:
- name: ssl
  version: latest

我的 cron.yaml 如下:

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

最后,我的 requirements.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.yaml cron.yaml

它似乎忽略了我的requirements.txt,并且未安装依赖项。我什至在本地gcloud开发服务器(dev_appserver.py ./app.yaml --enable_console)中运行它,当我使用开发服务器控制台尝试导入它们时,肯定没有安装这些库。

然后我尝试使用Python 3.7。这实际上将库安装在requirements.txt中,但是问题出在处理程序中的app.yaml中,我无法指定脚本名称。对于python 3.7,该值始终根据gcloud app.yaml reference设置为auto。

在gcloud应用引擎cron中执行我的脚本需要做什么。在Linux系统上,这将是crontab中的一个简单的cronjob设置,如下所示:

  

0 0 * * * python / send_daily_py

从我读到的有关Python 3.7的内容来看,似乎我需要django或flex处理请求并路由它们以执行我的自定义.py脚本,这似乎有点过头了,以便我可以执行一个脚本。当然可以解决这个问题吗?我什至尝试将库包含在我的应用文件夹中的子文件夹中,如下所示:

  

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

然后我在lib中添加了 init .py,然后将所有导入更改为使用

  

导入lib.name_of_library

这不起作用,因为这些库随后无法导入所需的子包。

**

Heeeeelp!

**

1 个答案:

答案 0 :(得分:1)

App Engine是PaaS产品,而不是IaaS产品(实际上,您可以在其中运行Linux映像并安装您提到的cron)。您不能在GAE中运行任意独立 python脚本。通过重新编写脚本以满足GAE应用程序要求,您可能能够实现所需的功能-基本上可以从HTTP(S)处理程序内部调用该功能。

对于第一代标准环境(python27运行时):

  • GAE未使用requirements.txt文件。正如您所发现的,您可以使用它来提供python依赖项的供应商,但还有更多工作要做,请参见Copying a third-party library
  • 您的脚本功能需要作为WSGI应用程序重新使用,这是您在app.yaml中配置的。来自Handlers element
  

脚本指令必须是python导入路径,例如,    package.module.app 指向WSGI应用程序。使用 Python模块路径的 script:指令的最后一个组件是   模块中全局变量的名称:该变量必须是   WSGI应用,通常习惯上称为**。

     

注意:就像Python import 语句一样,每个子目录   该程序包必须包含名为init.py的文件。

对于第二代标准环境(python37运行时):

  • 依赖关系是从您的requirements.txt文件中自动安装的,请参见Specifying Dependencies
  • auto的{​​{1}}语句中只能指定script:,因为应用本身是通过app.yaml配置指定的。因此,您需要重新编写脚本以在该应用中作为处理程序调用。来自Runtime and app elements
  

要让您的应用接收HTTP请求,入口点应包含一个   命令,该命令启动侦听指定端口的Web服务器   通过PORT环境变量。

flexible environment(与第二代标准类似的返工)可能更合适,尤其是因为您可以为实例配置更多的ram / cpu资源(可能会 需要根据您的entrypoint:文件来判断。