#python #discord.py #python-3.8
#python #discord.py #python-3.8
Вопрос:
Я пишу discord.py бот, и я пытаюсь создать команду, которая позволяет серверам устанавливать свои собственные префиксы. Это код:
@bot.command(
help = "Set the server prefix!"
)
async def setprefix(ctx, arg1):
with open('prefixes.json', 'a ') as f:
prefixes = json.load(f)
prefixes[ctx.guild.id] = arg1
await ctx.channel.send(f"The server prefix has been set to **{arg1}**")
Вот как выглядит файл json:
{
"guild_id": "!",
}
Здесь «guild_id»: «!» — это просто заполнитель, чтобы он имел смысл.
Когда я запускаю команду на своем тестовом сервере, это ошибка, из-за которой я получаю эту полную расшифровку:
Ignoring exception in command setprefix:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "/Users/secret/OneDrive/PyBot/Millenium_Build.py", line 174, in setprefix
prefixes = json.load(f)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 293, in load
return loads(fp.read(),
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/json/decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: JSONDecodeError: Expecting value: line 1 column 1 (char 0)
У кого-нибудь есть идеи, как это исправить?
Ответ №1:
with open('prefixes.json', 'a ') as f:
Открытие с a
помощью режима открывает файл для добавления, что означает, что указатель начинается с конца файла. Поэтому при вызове читать нечего json.load(f)
.
prefixes[ctx.guild.id] = arg1
Эта строка здесь также не имеет никакого эффекта вообще. Он ничего не запишет в файл, если это то, что вы ожидаете сделать.
Вместо этого вы хотите сделать что-то вроде этого:
with open('prefixes.json') as f:
prefixes = json.load(f)
prefixes[ctx.guild.id] = arg1
with open('prefixes.json', 'w') as f:
json.dump(prefixes, f)
...
В идеале вы хотели бы сделать это атомарным действием, но это будет сделано для демонстрации решения возникшей у вас проблемы.
Кроме того, конечная запятая в файле json также вызовет ошибку декодирования (хотя это не та ошибка, которую вы видите здесь).