Я получаю сообщение об ошибке с надписью AttributeError: объект ‘str’ не имеет атрибута ‘read’, и я не знаю, как это исправить

#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.
Я позволяю вам выбрать и попробовать это.