在 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 收听消息?

在 Google App Engine 上部署 create-react-app