7 votes

Exécuter un script python à la date prévue sur Google App Engine

Je suis à la recherche d'un bon samaritain qui puisse me fournir un squelette très basique pour exécuter un script python en utilisant Google App Engine. J'ai lu la documentation, vérifié les questions relatives à SO mais je suis perdu avec le format WebApp. Tout ce que je veux faire, c'est exécuter un script python qui accepte des arguments ou plusieurs script python, 6 fois par semaine pour écouter les changements dans un site web et les poster ensuite sur Firestore.

Je comprends le format cron et la plupart des fichiers de configuration. Je suis bloqué sur la façon d'arranger mes fichiers pour le projet, et sur le fonctionnement des url.

Tout ce que je demande, c'est un exemple très basique sur la façon d'exécuter efficacement les scripts. Le présent est de loin la meilleure ressource que j'ai trouvée, mais je n'arrive pas à comprendre ce qui se passe avec ce code provenant de ce site :

`#!/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() `

Voici le script python script que j'ai essayé d'exécuter à des fins de test uniquement, en utilisant 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)

D'après ce que j'ai compris, je dois utiliser Flask ou quelque chose de similaire pour que cela fonctionne, mais je ne comprends pas vraiment comment cela fonctionne, tout ce que je demande, c'est un petit échantillon et une brève explication, et à partir de là, j'ajouterai deux et deux.

Meilleures salutations

12voto

Racu Points 303

Enfin, mes enfants m'aimeront à nouveau. Il s'avère que j'ai regardé la mauvaise ressource GCP, comme @Dan_Cornilescu l'a fait remarquer, cela pourrait être une façon de le faire, mais la façon la plus simple de le faire est "Cloud Functions" en conjonction avec "Cloud Scheduler" et je l'ai trouvé juste par hasard.

Le présent L'article était le tout premier à le mentionner, mais je l'ai ignoré parce que l'auteur utilise encore une fois une application web pour illustrer le cas, pour mes besoins et mon manque d'argot technique, je n'ai tout simplement pas pu l'assimiler. Mais c'est vraiment aussi simple que cela devait l'être, dans votre Google Cloud Console :

  1. Aller à la section des fonctions
  2. Choisir comme déclencheur "Cloud Pub/Sub"
  3. Ajouter/choisir un sujet
  4. Sélectionnez votre runtime (Python3.7 bien sûr)
  5. Sélectionner la fonction à exécuter
  6. Créer
  7. Veillez à remplir le fichier "requirements.txt" dans l'onglet suivant.
  8. Allez dans la section Cloud Scheduler de GCP et créez un job (job cron).
  9. Choisir comme cible : "Pub/Sub"
  10. Saisissez le sujet que vous avez choisi pour votre fonction
  11. Si vous souhaitez envoyer des arguments pour vos fonctions, utilisez le payload à cette fin.

Pour utiliser un argument ou des arguments pour votre fonction Python, vous voulez utiliser la charge utile et utiliser ce qui suit à partir de leur fonction initiale :

pubsub_message = base64.b64decode(event['data']).decode('utf-8')

Le présent pubsub_message vous pouvez l'utiliser comme argument pour vos fonctions python.

Et c'est tout, c'est facile, super facile, à la fin je pense que c'est juste la même chose qu'un GAE sans la page visuelle, juste ce dont j'avais besoin, je savais qu'il devait y avoir une meilleure façon.

EDIT : L'article que je mentionne ici décrit comment utiliser gcloud pour télécharger vos fonctions directement depuis votre ordinateur.

enter image description here

2voto

Dan Cornilescu Points 5018

En répondre Ce que j'ai mentionné s'applique toujours - vous ne pourrez pas exécuter vos scripts de manière autonome sur le cron de GAE, simplement parce que le service cron n'est en fait qu'un ensemble de requêtes GET planifiées. Vous mayo être en mesure d'obtenir le même résultat final, mais en.. :

  • installation d'une application squelette
  • décomposer vos scripts en code que vous insérerez dans les gestionnaires de l'application, avec des arguments transmis dans les chaînes de requête.
  • configurer le service cron pour construire et déclencher ces demandes

Vous pouvez trouver un squelette de Python 3 dans Démarrage rapide pour Python 3 dans l'environnement standard App Engine

Vous pouvez également utiliser un service IaaS au lieu de GAE, comme par exemple Google Compute Engine où vous pouvez exécuter vos scripts directement, avec un service cron traditionnel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X