为什么我得到“RuntimeError:此事件循环已在运行”

2024-05-14 17:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用新的slack 2.0python库开发slack bot。我不熟悉python装饰器,我怀疑这是我问题的一部分。在

这是我的密码。。。在

#!/opt/rh/rh-python36/root/usr/bin/python
import os
import slack

# instantiate Slack client
slack_token = os.environ['SLACK_BOT_TOKEN']
rtmclient = slack.RTMClient(token=slack_token)
webclient = slack.WebClient(token=slack_token)

# get the id of my user
bot_id = webclient.auth_test()['user_id']
print('Bot ID: {0}'.format(bot_id))

def get_user_info(user_id):
    user_info = webclient.users_info(user=user_id)['ok']
    return user_info

@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
    data = payload['data']
    user_id = data['user']
    print(get_user_info(user_id))

rtmclient.start()

它在启动时输出Bot ID(使用webclient),但是当我再次调用webclient时,它会以RuntimeError: This event loop is already running崩溃。在

^{pr2}$

真正让我困惑的是,如果我注释掉第一个调用webclient.auth_test()的行,我就没有任何问题。每次webclient.users_info()发送数据时,我对webclient.users_info()的调用都有效。在

#!/opt/rh/rh-python36/root/usr/bin/python
import os
import slack

# instantiate Slack client
slack_token = os.environ['SLACK_BOT_TOKEN']
rtmclient = slack.RTMClient(token=slack_token)
webclient = slack.WebClient(token=slack_token)

# get the id of my user
#bot_id = webclient.auth_test()['user_id']
#print('Bot ID: {0}'.format(bot_id))

def get_user_info(user_id):
    user_info = webclient.users_info(user=user_id)['ok']
    return user_info

@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
    data = payload['data']
    user_id = data['user']
    print(get_user_info(user_id))

rtmclient.start()
[root@slackbot-01 bin]# scl enable rh-python36 /root/slackbot/bin/slackbot.py
True
True
^C[root@slackbot-01 bin]#

我需要获取机器人id,这样我就可以确保它不会回复自己的消息。我不明白为什么在用修饰符获得parse message函数之外的bot id后,我的代码就不能工作了。在

我做错什么了?在


Tags: importinfotokenidmessagedatagetbin
2条回答

python事件循环对于编程库来说是一件棘手的事情,在SlackClient的2.0版本中,事件队列的管理方式存在一些问题。看起来2.1版做了一些改进,但它似乎是一个正在进行的工作,我仍然遇到这个问题。我希望将来会有更新使它更健壮。在

同时,文件顶部的以下代码(使用pip安装)通常会为我解决此问题:

import nest_asyncio
nest_asyncio.apply()

请记住,这将改变应用程序其余部分处理事件队列的方式(如果这是一个因素)。在

如果您使用的是RTM,RTMClient会为您创建一个WebClient。当您处理事件时,它的句柄应该在有效负载中传递给您。您可以通过查找总是在RTM成功连接后调度的“open”事件并在“open”事件处理程序中进行查找来检查您的ID。在

相关问题 更多 >

    热门问题