【问题标题】:discord.py - mutliple messages posting - RuntimeError: Event loop is closeddiscord.py - 多条消息发布 - RuntimeError:事件循环已关闭
【发布时间】:2021-02-21 22:11:12
【问题描述】:

我想创建一个 Discord 机器人,它将我在控制台中输入的消息或使用另一段代码(例如传感器数据)生成的消息发送到通道。 我已经尝试过以下操作,但在输入第二条消息后,我得到了 RuntimeError: Event loop is closed。有什么建议吗?

import discord


def send_message(message):
    token = "mydiscordbottoken"
    channel_id = channelid
    bot = discord.Client()

    @bot.event
    async def on_ready():
        await bot.get_channel(channel_id).send(message)
        await bot.close()

    bot.run(token)


while True:
    mes = input('Enter message: ')
    send_message(mes)

我想在打印消息后回到我的 while 循环外的功能。 运行代码时出现以下错误:

Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x00000206ABBDC940>
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 719, in call_soon
    self._check_closed()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x00000206ABBDC940>
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 719, in call_soon
    self._check_closed()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Traceback (most recent call last):
  File "C:/Users/janik/PycharmProjects/learnpython/main.py", line 19, in <module>
    send_message(mes)
  File "C:/Users/janik/PycharmProjects/learnpython/main.py", line 14, in send_message
    bot.run(token)
  File "C:\Users\janik\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\client.py", line 695, in run
    future = asyncio.ensure_future(runner(), loop=loop)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\tasks.py", line 669, in ensure_future
    task = loop.create_task(coro_or_future)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 429, in create_task
    self._check_closed()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
sys:1: RuntimeWarning: coroutine 'Client.run.<locals>.runner' was never awaited

我对 asycio 和 discord.py 有点陌生,只是想将多条消息打印到我的 discord 服务器。 提前谢谢!

【问题讨论】:

    标签: python runtime-error discord.py


    【解决方案1】:

    您没有正确设置代码,input() 将冻结代码。这是我建议您这样做的方法。

    import discord
    from discord.ext import commands
    
    client = commands.Bot(command_prefix = "PREFIX")
    
    @client.command()
    async def sendMessage(ctx, channel: discord.TextChannel, *, message):
        await channel.send(message)
    
    client.run("TOKEN")
    

    这样你就可以执行命令(PREFIX)sendMessage (#CHANNEL) (MESSAGE)。由于您是新手,我还将解释命令参数中* 的用法。 * 允许我们的消息长度为多个单词,以便频道之后的任何内容都包含在消息中。

    如果您还有任何问题,请随时在 StackOverflow 或 Discord 上的 starmoan#4269 上给我发消息!

    【讨论】:

    • 非常感谢!但我的目标是实现我可以在我的 python cmd 行中输入消息,然后启动机器人,将输入的消息发送到指定的频道,然后下线。这应该是重复的,例如 while 循环。没有人应该能够通过不和谐聊天与机器人互动
    • 好吧,我解决了我的问题。我切换到了一个简单的 webhook,这正是我正在寻找的 discord_webhook (pypi.org/project/discord-webhook)
    • 很高兴你找到了你要找的东西,很抱歉我不太明白你的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2019-01-04
    • 2021-04-27
    • 2022-07-15
    • 1970-01-01
    相关资源
    最近更新 更多