J'essaie d'écrire des bots de discorde en utilisant Python, j'ai croisé et jeté ensemble ce bot.
import discord
import asyncio
import random
client = discord.Client()
inEmail = input("Email:")
inPassword = input("Passwd:")
async def background_loop():
await client.wait_until_ready()
while not client.is_closed:
channel = client.get_channel("************")
messages = ["Hello!", "How are you doing?", "Testing!!"]
await client.send_message(channel, random.choice(messages))
await asyncio.sleep(120)
client.loop.create_task(background_loop())
client.run(inEmail, inPassword)
Pourtant, lorsque j'ai essayé de l'exécuter, j'ai reçu un SyntaxError
:
File "1.py", line 7
async def background_loop():
^
SyntaxError: invalid syntax
Pourquoi donc? Je n'ai jamais reçu cela auparavant lorsque je l'ai testé.
Les requêtes asynchrones ont été introduites dans Python dans la v3.3 , si vous exécutez Python avant la v3.3 (y compris la v2.X), vous aurez installer une version plus récente de Python.
uniquement si vous exécutez Python 3.3: asyncio
ne fait pas partie de la bibliothèque stdlib, vous aurez besoin de l’installer manuellement à partir de Pypi :
pip install asyncio
Les mots-clés async
et await
ne sont valides que pour Python 3.5 ou plus récent . Si vous utilisez Python 3.3 ou 3.4, vous devrez apporter les modifications suivantes à votre code:
@asyncio.coroutine
À la place de l'instruction async
:async def func():
pass
# replace to:
@asyncio.coroutine
def func():
pass
yield from
Au lieu de await
:await coroutine()
# replace to:
yield from coroutine()
Voici un exemple de ce que votre fonction doit changer (si vous êtes sur 3.3-3.4):
import asyncio
@asyncio.coroutine
def background_loop():
yield from client.wait_until_ready()
while not client.is_closed:
channel = client.get_channel("************")
messages = ["Hello!", "How are you doing?", "Testing!!"]
yield from client.send_message(channel, random.choice(messages))
yield from asyncio.sleep(120)
La syntaxe susmentionnée est toujours prise en charge dans les versions plus récentes de Python 3, mais il est recommandé d'utiliser await
et async
s'il n'est pas nécessaire de prendre en charge Python 3.3- 3.4. Vous pouvez vous référer à ceci documentation , voici un court extrait:
Le type de coroutine
async def
A été ajouté dans Python 3.5. Il est recommandé s'il n'est pas nécessaire de prendre en charge les anciennes versions Python.
discord.py prend actuellement en charge 3.4.2-3.6.6, (. Il ne prend pas en charge les versions 3.3-3.4.1, 3.7 à partir de janvier 2019 ).
Pour développer avec discord.py, je suggère d'utiliser la branche discord.py rewrite:
discord.py-rewrite supporte 3.5.3-3.7.
A partir de la version 3.7, async
et await
sont des mots-clés réservés.
comme l'erreur dans l'image ci-dessous.
Copier et ouvrir le chemin (sans __init__.py
). Vous obtiendrez une liste des fichiers .py
Renommer async.py
à _async.py
ou tout ce que vous voulez, car async est maintenant un mot clé réservé chez nous à partir de la version 3.7.
Une fois renommé, modifiez le nouveau nom partout.
* NOTE Bien que ce ne soit pas une solution permanente, cela a fonctionné pour moi en cas d'erreur de syntaxe identique lors de l'utilisation de firebase. La meilleure solution consiste à utiliser la version précédente de Python. c'est-à-dire la version ci-dessous 3.7.
Je l'ai résolu en installant le PyMC mis à jour depuis github (ils ont corrigé le bogue qui se produit dans Python 3.7):
pip install git+https://github.com/pymc-devs/pymc.git