5

I am trying to create a Discord bot with Python, however whenever I run the sample code here:

import discord

client = discord.Client()

@client.event
async def on_message(message):
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return

    if message.content.startswith('!hello'):
        msg = 'Hello {0.author.mention}'.format(message)
        await client.send_message(message.channel, msg)

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.run('tokenhere')

It returns the error:

Traceback (most recent call last):

  File "<ipython-input-6-ea5a13e5703d>", line 1, in <module>
    runfile('C:/Users/User/Pictures/rito_bot.py', wdir='C:/Users/User/Pictures')

  File "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 703, in runfile
    execfile(filename, namespace)

  File "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/User/Pictures/rito_bot.py", line 22, in <module>
    client.run('token')

  File "C:\Users\User\Anaconda3\lib\site-packages\discord\client.py", line 595, in run
    _cleanup_loop(loop)

  File "C:\Users\User\Anaconda3\lib\site-packages\discord\client.py", line 97, in _cleanup_loop
    loop.close()

  File "C:\Users\User\Anaconda3\lib\asyncio\selector_events.py", line 94, in close
    raise RuntimeError("Cannot close a running event loop")

RuntimeError: Cannot close a running event loop 

Every other line seems to run just fine, but without the last line it doesn't connect to the server, which makes it useless.

Note: I have seen the question here, however OP's solution doesn't seem applicable to my situation.

Patrick Haugh
  • 59,226
  • 13
  • 88
  • 96

2 Answers2

9

(Spyder maintainer here) To run async code in our consoles you first need to install the nest_asyncio package and then call it before running any of your code as described on its Readme.

Carlos Cordoba
  • 33,273
  • 10
  • 95
  • 124
  • The correct approach is given here: https://stackoverflow.com/questions/50243393/runtimeerror-this-event-loop-is-already-running-debugging-aiohttp-asyncio-a Check for a running event loop and if there is one, use await otherwise run. – Blaze Oct 20 '20 at 17:34
2

I encountered the same problem trying to run Discord examples on Jupyter Notebook. Moving to plain python script solved it for me.

Nir
  • 1,618
  • 16
  • 24
  • it turns out that this problem seems to be unique to anaconda, so this would work. i was looking for a solution for all compilers, so switching to plain Python script wouldn't really be applicable. – 12 rhombi in grid w no corners May 04 '20 at 19:50