#python #discord.py
#python #discord.py
Вопрос:
@commands.command()
async def trash(self, ctx, user: discord.Member):
auth = str(os.getenv("FLIPNOTE_API"))
url2 = f'https://api.alexflipnote.dev/trash?face={ctx.author.avatar_url_as(format="png")}amp;trash={user.avatar_url_as(format="png")}'
headers = {'Authorization': auth}
async with aiohttp.ClientSession() as session:
async with session.get(url2, headers=headers) as res:
link = re.compile(r"(?<=<ClientResponse()(.*)(?=))").search(repr(res)).group(1)
link2 = BytesIO(link)
image = await link2.read()
file = discord.File(image, filename="lol.png")
await ctx.send(file=file)
Это код, который я использую, и ошибка AttributeError: объект ‘str’ не имеет атрибута ‘read’
Пожалуйста, скажите мне, как я могу это исправить, я был бы признателен
, это обратная трассировка, кстати:
Ignoring exception in on_message
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "/home/runner/DayStride/cogs/fun.py", line 1461, in trashmoment
link2 = BytesIO(link)
TypeError: a bytes-like object is required, not 'str'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
await ctx.command.invoke(ctx)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "/opt/virtualenvs/python3/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: TypeError: a bytes-like object is required, not 'str'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 71, in wrapped
ret = await coro(*args, **kwargs)
File "/home/runner/DayStride/cogs/fun.py", line 1480, in trasherror
await await ctx.send(error)
TypeError: object NoneType can't be used in 'await' expression
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/client.py", line 333, in _run_event
await coro(*args, **kwargs)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 943, in on_message
await self.process_commands(message)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 940, in process_commands
await self.invoke(ctx)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 907, in invoke
await ctx.command.dispatch_error(ctx, exc)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 422, in dispatch_error
await injected(cog, ctx, error)
File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 77, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: object NoneType can't be used in 'await' expression
В нем говорится, что NoneType нельзя использовать в выражении await, но я думаю, что основная проблема заключается в str, но я не уверен
Комментарии:
1. Пожалуйста, отправьте сообщение об обратном отслеживании, чтобы мы могли видеть полное сообщение и строку с ошибкой в контексте.
2. Кроме того,
re
хранится кэш недавно использованных регулярных выражений. Если вы это сделаетеlink = re.search(r"(?<=<ClientResponse()(.*)(?=))", repr(res)).group(1)
, это, вероятно, будет более эффективным, чем перекомпиляция каждый раз.3. Я добавил обратную трассировку
4. Заголовок вашего сообщения гласит: «Я получаю сообщение об ошибке с надписью AttributeError: объект’str’ не имеет атрибута’read'», но я не вижу этого нигде в опубликованном вами отслеживании.
5. Хорошо, расскажите мне, как вы собираетесь работать с кодом. Вы выполняете какое-то регулярное выражение и получаете строку из сообщения пользователя, которую вы сохраняете как
link
. Затем вы хотите попытаться создатьBytesIO
объект из этой строки… почему? И затем вы хотите прочитать из этого потока … и это каким-то образом должно создатьimage
? Как?
Ответ №1:
link2 = BytesIO(link)
image = await link2.read()
Вы должны проверить возвращаемое значение BytesIO (link),
поскольку оно похоже на строку.
У которого нет метода «read».
Что вы пытаетесь сделать со своим caode?
Комментарии:
1. Не обязательно. Вызываемые функции, такие как
discord.File
, могут вызывать ошибку.2. Вы вполне можете быть правы, просто OP должен предоставить больше контекста, прежде чем мы узнаем.
3. Я в основном использую api, вы можете увидеть его здесь , и то, что отправляет res, — это не то, что я хочу, я хочу, чтобы это делало, я хочу изображение конечной точки, но я немного борюсь
4. кстати, я не могу увидеть возвращаемое значение BytesIO (ссылка), потому что оно возвращает ошибку
Ответ №2:
Согласно документу: https://docs.python.org/3/library/io.html
In-memory streams
It is also possible to use a str or bytes-like object as a file for
both reading and writing. For strings StringIO can be used like a
file opened in text mode.
BytesIO can be used like a file opened in binary mode. Both provide full
read-write capabilities with random access.
Buffered Streams
Buffered I/O streams provide a higher-level interface to an I/O device
than raw I/O does.
class io.BytesIO([initial_bytes])
A binary stream using an in-memory bytes buffer. It inherits BufferedIOBase.
The buffer is discarded when the close() method is called.
The optional argument initial_bytes is a bytes-like object that contains
initial data.
Похоже, вы даете строковый аргумент конструктору BytesIO (link). ссылка кажется строкой? Но для этого нужно несколько байтов, а не строка.
>>> view = b.getbuffer()
>>> view[2:4] = b"56"
>>> b.getvalue()
Итак, вам нужно изменить тип аргумента или, возможно, вместо этого использовать StringIO.
Я позволяю вам выбрать и попробовать это.