J'essaie de configurer une fonction Google Cloud qui reflète un référentiel github de script python. J'ai déjà implémenté avec succès la fonction sans mise en miroir github, mais pour une raison quelconque, lorsque je teste la fonction d'un projet dans lequel j'utilise la mise en miroir, j'obtiens l'erreur répertoriée dans le titre.
L'en-tête de méthode pour la fonction que j'appelle dans mon fichier main.py est ci-dessous:
def post_tweet(data, context):
J'ai le paramètre de context
dans l'en-tête, donc je ne sais pas pourquoi il dit que je manque l'argument.
Edit: Comme demandé, voici le code complet.
import os import sys import tweepy # source: https://www.cookieshq.co.uk/posts/how-to-build-a-serverless-twitter-bot-with-python-and-google-cloud # docs: # - https://cloud.google.com/functions/docs/env-var#functions_env_var_set-python # - https://cloud.google.com/functions/docs/writing/#functions-writing-helloworld-http-python def setup_api(): auth = tweepy.OAuthHandler(os.environ.get('CONSUMER_KEY'), os.environ.get('CONSUMER_SECRET')) auth.set_access_token(os.environ.get('ACCESS_TOKEN'), os.environ.get('ACCESS_TOKEN_SECRET')) return tweepy.API(auth) def post_tweet(data, context): api = setup_api() tweet = 'Hello, world!' status = api.update_status(status=tweet) return 'Tweet Posted'
Edit 2: Pour clarifier, j'ai ce code exact qui fonctionne parfaitement bien lorsque j'utilise l'éditeur en ligne Google Cloud Function. L'erreur répertoriée dans le titre se produit uniquement lorsque j'utilise l'option de cloud source repository
et que je la lie à un référentiel git.
3 Réponses :
En fait, je ne sais pas comment vous appelez la fonction, mais voici un exemple de travail basé sur votre exemple:
gcloud functions deploy post_tweet --region europe-west1 --memory=128MB --env-vars-file .env --runtime python37 --trigger-http
Ensuite, vous pouvez le déployer.
import os import sys import tweepy # source: https://www.cookieshq.co.uk/posts/how-to-build-a-serverless-twitter-bot-with-python-and-google-cloud # docs: # - https://cloud.google.com/functions/docs/env-var#functions_env_var_set-python # - https://cloud.google.com/functions/docs/writing/#functions-writing-helloworld-http-python from dotenv import load_dotenv load_dotenv() def setup_api(): auth = tweepy.OAuthHandler(os.environ.get( 'CONSUMER_KEY'), os.environ.get('CONSUMER_SECRET')) auth.set_access_token(os.environ.get('ACCESS_TOKEN'), os.environ.get('ACCESS_TOKEN_SECRET')) return tweepy.API(auth) def post_tweet(): api = setup_api() tweet = 'Hello, world!' status = api.update_status(status=tweet) return 'Tweet Posted' if __name__ == "__main__": # just for checking if everything goes fine print(post_tweet())
La fonction post_tweet
n'a pas besoin d'être appelée dans le code. Les paramètres de la fonction Google Cloud sont configurés pour l'appeler lorsqu'elle est déclenchée.
De la manière pythonique, vous pouvez simplement appeler post_tweet () pour créer un nouveau tweet avec data
message de data
, et il semble que Google Cloud l'appelle sans aucun argument comme dans l'exemple original utilisé.
Je ne pense pas que cela résout mon problème. Lorsque je fais ce que vous faites et que je supprime les paramètres de post_tweet, j'obtiens l'erreur suivante lorsque je teste la fonction: post_tweet() takes 0 positional arguments but 1 was given
Il semble donc qu'il passe un argument à post_tweet()
. Savez-vous quel est cet argument ou cet usage?
Après avoir joué avec cela un peu plus, il semble que le paramètre de context
n'est pas passé lors de la mise en miroir à partir d'un dépôt github. L'en-tête de la méthode ne doit accepter qu'un paramètre de data
: def post_tweet(data):
Je pense que les paramètres requis dépendent de votre méthode d'invocation. Si vous utilisez Pub / Sub pour déclencher la fonction, vous avez besoin de def post_tweet(event, context):
Cependant, si vous déployez avec un déclencheur HTTP, un seul paramètre est nécessaire: def post_tweet(request):
Comme erreur,
post_tweet
accepte deux arguments mais vous en avez transmis un. Veuillez ajouter le code complet pour une meilleure aide.@Masoud Merci pour la suggestion. Le code complet est maintenant dans le post.
Il n'y a aucune utilisation des
data
et de l'argument decontext
dans votre fonctionpost_tweet
.Les
data
et les arguments decontext
sont requis pour une fonction Google Cloud. Les documents auxquels je fais référence sont liés dans les commentaires du code.