在 Google App Engine 上按计划运行 python 脚本
Posted
技术标签:
【中文标题】在 Google App Engine 上按计划运行 python 脚本【英文标题】:Run a python script on schedule on Google App Engine 【发布时间】:2019-06-12 05:04:26 【问题描述】:我正在寻找一个可以提供非常基本的骨架来使用 Google App Engine 运行 python 脚本的好撒玛利亚人。我已经阅读了文档,检查了相关的 SO 问题,但我迷失了 WebApp 格式。我想要做的就是运行一个接受参数的 python 脚本或几个 python 脚本,每周 6 次以监听网站的变化,然后将它们发布到 Firestore。
我了解 cron 格式和大部分配置文件。我不知道如何为项目安排我的文件,以及 url 的工作原理。
我要问的只是一个关于如何有效运行 python 脚本的非常基本的示例。 This 是迄今为止我找到的最好的资源,但我无法真正理解该网站上的这段代码发生了什么:
`#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
import feedparser
import time
class Item(db.Model):
title = db.StringProperty(required=False)
link = db.StringProperty(required=False)
date = db.StringProperty(required=False) class Scrawler(webapp.RequestHandler):
def get(self):
self.read_feed()
self.response.out.write(self.print_items())
def read_feed(self):
feeds = feedparser.parse( "http://www.techrepublic.com/search?t=14&o=1&mode=rss" )
for feed in feeds[ "items" ]:
query = Item.gql("WHERE link = :1", feed[ "link" ])
if(query.count() == 0):
item = Item()
item.title = feed[ "title" ]
item.link = feed[ "link" ]
item.date = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(time.time()))
item.put()
def print_items(self):
s = "All items:<br>"
for item in Item.all():
s += item.date + " - <a href='" + item.link + "'>" + item.title + "</a><br>"
return s application = webapp.WSGIApplication([('/', Scrawler)], debug=True) def main():
run_wsgi_app(application) if __name__ == "__main__":
main() `
这是我尝试运行的python脚本,仅用于测试,使用python3.7:
import sys
from datetime import datetime
import firebase_admin
from firebase_admin import firestore
app = firebase_admin.initialize_app()
db = firestore.client()
def hello_firestore(user_name):
db.collection('firestore_test').document('test').set(
'time': str(datetime.now()),
'user_name': user_name
)
if __name__ == "__main__":
try:
user_name = sys.argv[1]
except:
print('Error with the argument', file=sys.stderr)
try:
hello_firestore(user_name)
except:
print('Error accessing the database', file=sys.stderr)
sys.exit(0)
据我所知,我必须使用 Flask 或类似的东西才能使其工作,但我并不真正了解它是如何工作的,我所要求的只是一个小样本和简短的解释,从那里我'加二加二。
最好的问候
【问题讨论】:
相关:***.com/questions/44856414/… @DanCornilescu 是的,我实际上将该问题标记为最喜欢的问题。我的理解问题是,我看到的大多数示例都展示了如何显示网页,而目前我只想使用 App Engine 在 cron 上运行几个脚本,我肯定会在未来。当我使用 Python3.7 时,该骨架适用于 python2 部署时收到一堆警告。还是我在 App Engine 中寻找错误的功能? 【参考方案1】:我的孩子们终于会再次爱上我了。 原来我正在查看错误的 GCP 资源,正如@Dan_Cornilescu 指出的那样,这可能是一种方法,但最简单的方法是与“Cloud Scheduler”结合使用的“Cloud Functions”,我发现它只是通过只是机会。
This 文章是第一个提到它的,当时我把它传递了,因为作者再次使用网络应用程序来说明案例,由于我的需要和缺乏技术术语,我不能数字。 但在您的 Google Cloud Console 中,它真的很简单:
-
转到函数部分
选择作为触发器“Cloud Pub/Sub”
添加/选择主题
选择您的运行时(当然是 Python3.7)
选择要执行的函数
创建
确保填写下一个选项卡上的“requirements.txt”文件
转到 GCP 的 Cloud Scheduler 部分并创建一个作业(cron 作业)
选择作为目标:“Pub/Sub”
输入您为函数选择的主题
如果要为函数发送参数,请使用有效负载
为此目的。
要为您的 Python 函数使用一个或多个参数,您需要使用有效负载并使用其初始函数中的以下内容:
pubsub_message = base64.b64decode(event['data']).decode('utf-8')
这个pubsub_message
你可以用它作为你的python函数的参数。
这就是所有人,简单,超级简单,最后我认为与没有可视页面的 GAE 一样,正是我所需要的,我知道一定有更好的方法。
编辑:我在这里提到的文章描述了如何使用 gcloud 直接从您的计算机上传您的函数。
【讨论】:
【参考方案2】:我提到的answer 仍然适用 - 您将无法在 GAE cron 上以独立方式运行脚本,这仅仅是因为 cron 服务实际上只是一组预定的 GET 请求。您也许能够获得相同的最终结果,但通过:
安装骨架应用程序 将您的脚本分解成代码,然后将其填充到应用的处理程序中,并在请求的查询字符串中传递参数 配置 cron 服务以构建和触发这些请求您可以在Quickstart for Python 3 in the App Engine Standard Environment 中找到 Python 3 框架
当然,您也可以使用 IaaS 服务而不是 GAE,例如 Google Compute Engine,您可以使用传统的 cron 服务直接运行您的脚本。
【讨论】:
我已经考虑过使用您所描述的 IaaS,但是对于我想要运行的几个功能,我认为太多了。幸运的是,我终于找到了我需要的东西,谢谢您的帮助。 @Racu Duh,我应该想到 CF... 是的,很好的解决方案。以上是关于在 Google App Engine 上按计划运行 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
没有在Google App Engine中安排的Cron作业
连接 Google App Engine 和 Google Compute Engine
Cron Job-具有Google App Engine的纯Django项目
在 Google-App-Engine 中使用 HSQLDB
如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?