问题
I am attempting to make a Discord bot in Python that gives you a role on a Discord server based upon what class you are in (at my school). I have just started, but I am receiving an error whenever I attempt to run it (I run it in Google Colab in a Python 3 Notebook). Here is my code:
from datetime import date
import time
import discord
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
client.run('my token (not shown for obvious reasons)')
starttime=time.time()
while True:
currentTime = time.strftime("%H:%M")
print("new minute")
if 0 <= date(int(time.strftime("%Y")), int(time.strftime("%m")), int(time.strftime("%d"))).weekday() <= 4:
if currentTime == "13:41":
print("First hour has started!")
elif currentTime == "13:45":
print("First hour has started! (hs)")
elif currentTime == "14:30":
print("First hour has ended at high school.")
time.sleep(60.0 - ((time.time() - starttime) % 60.0))
When I run it, it presents me with this error:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-5-d40f2b4200ae> in <module>()
9 print('We have logged in as {0.user}'.format(client))
10
---> 11 client.run('my token')
12
13 starttime=time.time()
2 frames
/usr/local/lib/python3.6/dist-packages/discord/client.py in run(self, *args, **kwargs)
570
571 try:
--> 572 loop.add_signal_handler(signal.SIGINT, lambda: loop.stop())
573 loop.add_signal_handler(signal.SIGTERM, lambda: loop.stop())
574 except NotImplementedError:
/usr/lib/python3.6/asyncio/unix_events.py in add_signal_handler(self, sig, callback, *args)
92 "with add_signal_handler()")
93 self._check_signal(sig)
---> 94 self._check_closed()
95 try:
96 # set_wakeup_fd() raises ValueError if this is not the
/usr/lib/python3.6/asyncio/base_events.py in _check_closed(self)
375 def _check_closed(self):
376 if self._closed:
--> 377 raise RuntimeError('Event loop is closed')
378
379 def _asyncgen_finalizer_hook(self, agen):
RuntimeError: Event loop is closed
If I put the client.run
command at the bottom, the program never reaches it because the loop prevents it from reaching the command.
Am I missing something? I do not know where the problem is. Would appreciate help.
回答1:
Jupyter notebooks, which are what Google Colab is based on and uses, have their own event loops.
Client.run uses the current event loop if none is specified and closes it once it finishes running.
You should have been able to run it once, before the event loop was closed and successive attempts to run it again would tell you as much. You'll want to use Client.start instead and handle the event loop yourself if you want to run it multiple times within the same notebook.
回答2:
Basically there are various hacks you need to do if you want to run a discord bot on google colab. Here I use discord.ext python library, executing this, however will be blocking, and prevent you from executing any other cells.
!pip install discord.py
import nest_asyncio
nest_asyncio.apply()
import asyncio
await = lambda x: asyncio.get_event_loop().run_until_complete(x)
async def init(what, token):
await what(token)
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix="")
async def start():
await bot.wait_until_ready()
print("ready")
await bot.get_channel(channelID).send("hi")
bot.loop.create_task(start())
TOKEN = "" #@param {type: "string"}
来源:https://stackoverflow.com/questions/59888388/receiving-a-runtime-error-at-client-runtoken-when-running-my-discord-py-bot