J'essaie de faire un simple bot Slack en utilisant asyncio, en utilisant largement l'exemple here pour la partie asyncio et here pour la partie bot Slack.Asyncio Python avec Slack bot
Les deux exemples fonctionnent d'eux-mêmes, mais quand je les ai mis ensemble, il semble que ma boucle ne boucle pas: elle passe une fois, puis meurt. Si info
est une liste de longueur égale à 1, ce qui arrive lorsqu'un message est tapé dans une salle de discussion avec le robot, la coroutine est censée être déclenchée, mais elle ne l'est jamais. (Tout le Coroutine essaye de faire maintenant est d'imprimer le message, et si le message contient "/ heure", il obtient le bot pour imprimer l'heure dans le salon de discussion où il a été demandé). L'interruption du clavier ne fonctionne pas non plus, je dois fermer l'invite de commande à chaque fois.
Voici mon code:
import asyncio
from slackclient import SlackClient
import time, datetime as dt
token = "MY TOKEN"
sc = SlackClient(token)
@asyncio.coroutine
def read_text(info):
if 'text' in info[0]:
print(info[0]['text'])
if r'/time' in info[0]['text']:
print(info)
resp = 'The time is ' + dt.datetime.strftime(dt.datetime.now(),'%H:%M:%S')
print(resp)
chan = info[0]['channel']
sc.rtm_send_message(chan, resp)
loop = asyncio.get_event_loop()
try:
sc.rtm_connect()
info = sc.rtm_read()
if len(info) == 1:
asyncio.async(read_text(info))
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
print('step: loop.close()')
loop.close()
Je pense qu'il est la partie de la boucle qui est brisé, car il ne semble jamais se rendre à la coroutine. Donc, peut-être une façon plus courte de poser cette question est ce qui est à propos de mon essai: déclaration qui empêche de faire une boucle comme dans l'exemple asyncio que j'ai suivi? Y at-il quelque chose à propos de sc.rtm_connect()
qu'il n'aime pas? Je suis nouveau en asyncio, donc je fais probablement quelque chose de stupide. Est-ce même la meilleure façon d'essayer de s'y prendre? En fin de compte, je veux que le bot fasse des choses qui prennent du temps à calculer, et je voudrais qu'il reste réactif à ce moment-là, donc je pense que je dois utiliser asyncio ou threads dans une certaine variété, mais je suis ouvert à meilleures suggestions.
Merci beaucoup, Alex
Je suis inquiet que cette question peut être trop large. Est-il possible de poser une question plus précise ou de poser une série de questions? –
Assez sûr que la partie qui est cassée est la boucle, puisqu'elle n'appelle même jamais la coroutine. Je suppose qu'une question raccourcie serait là quelque chose à propos de l'appel 'sc.rtm_connect()' qui empêche l'objet boucle asyncio de boucler comme normal? –