Я разрабатываю бота для разногласий с помощью discord.py==2.1.0.
Я использую cog для написания основной функции, которую я хочу использовать, но я обнаружил, что когда весь бот обернут асинхронной функцией и вызывается asyncio.run()
, мой терминал не будет отображать никаких сообщений об ошибках, когда в моем скрипте cog есть какая-либо ошибка времени выполнения.
Вот пример приложения. Я сохранил свой токен бота в переменной среды.
import os
import discord
from discord.ext import commands
import asyncio
token = os.environ["BOT_TOKEN"]
class Bot(commands.Bot):
def __init__(self):
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
description = "bot example."
super().__init__(
command_prefix=commands.when_mentioned_or('!'),
intents=intents,
description=description
)
async def on_ready(self):
print(f'Logged in as {self.user} (ID: {self.user.id})')
print('------')
bot = Bot()
async def load_extensions():
for f in os.listdir("./cogs"):
if f.endswith(".py"):
await bot.load_extension("cogs." + f[:-3])
async def main():
async with bot:
await load_extensions()
await bot.start(token)
asyncio.run(main())
from discord.ext import commands
class Test(commands.Cog):
def __init__(self, client):
self.client = client
@commands.Cog.listener()
async def on_ready(self):
print("Ready")
@commands.command()
async def command(self, ctx):
test_error_message() # An runtime error example
print("Command")
async def setup(client):
await client.add_cog(Test(client))
python bot.py
!command
в канале разногласий, в терминале не отображается сообщение об ошибке, но не распечатывается «Команда», поэтому я уверен, что код остановился на строке, которую я вызвал test_error_message()
from discord.ext import tasks
@tasks.loop(seconds=10)
async def avatar_update():
# code here
async def main():
async with bot:
avatar_update.start()
await load_extensions()
await bot.start(token)
Спасибо!
Client.start()
не настраивает ведение журнала, поэтому, если вы хотите его использовать, вам нужно сделать это самостоятельно (есть setup_logging
, чтобы добавить базовую конфигурацию). run()
настраивает ведение журнала для вас.
Для получения дополнительной информации прочитайте документы. https://discordpy.readthedocs.io/en/stable/logging.html?highlight=logging
Да, run() уже вызывает это, поэтому вы не можете. Если вы используете run() и хотите выполнить асинхронную настройку, вы можете использовать setup_hook.
Я следил за документом о ведении журнала, добавил строку
discord.utils.setup_logging()
решил проблему! Кстати, я запускаюbot.run()
в асинхронном цикле событий, я получаю ошибку времени выполнения, потому чтоasyncio.run(runner())
вызывается, поэтому я выбираю другой путь. Спасибо за столь быстрый ответ!