Python aiogram exe бот не может отправить фото

Вопрос или проблема

У меня есть этот код для отправки изображения
@router.message(CommandStart()) async def cmd_help(message: Message,state : FSMContext): await state.clear() file_path = "app/other/image.jpg" await message.reply_photo( photo = FSInputFile( path=file_path ) )
и он работает, если выполнить с помощью python main.py, но когда я пытаюсь скомпилировать и открыть его с помощью

pyinstaller --onefile --add-data "C:/Users/Admin/Desktop/tgbot/app/other/*;. " -F -i "path:)\icon.ico" main.py

возникает ошибка

`
TelegramNetworkError: HTTP Client говорит – ClientOSError: [Errno 2] Не удается записать тело запроса для https://api.telegram.org/ bottoken:)/sendPhoto
Traceback (most recent call last):
File “aiohttp\client_reqrep.py”, line 637, in write_bytes
File “aiohttp\multipart.py”, line 993, in write
File “aiohttp\payload.py”, line 442, in write
File “aiogram\types\input_file.py”, line 103, in read
File “aiofiles\base.py”, line 98, in aenter
File “aiofiles\threadpool_init_.py”, line 94, in _open
File “concurrent\futures\thread.py”, line 58, in run
FileNotFoundError: [Errno 2] Нет такого файла или директории: ‘app/other/image.jpg’

        Вышеупомянутое исключение стало непосредственной причиной следующего исключения:

            Traceback (most recent call last):
        File "aiogram\client\session\aiohttp.py", line 181, in make_request
        File "aiohttp\client.py", line 1353, in __aenter__
    File "aiohttp\client.py", line 684, in _request
       File "aiohttp\client_reqrep.py", line 999, in start
    File "aiohttp\streams.py", line 640, in read
      aiohttp.client_exceptions.ClientOSError: [Errno 2] Не удается записать тело запроса для bottoken:)                /sendPhoto

         Во время обработки вышеупомянутого исключения возникло другое исключение:

     Traceback (most recent call last):
  File "aiogram\dispatcher\dispatcher.py", line 309, in _process_update
           File "aiogram\dispatcher\dispatcher.py", line 158, in feed_update
        File "aiogram\dispatcher\middlewares\error.py", line 25, in __call__
       File "aiogram\dispatcher\middlewares\user_context.py", line 56, in __call__
         File "aiogram\fsm\middleware.py", line 42, in __call__
    File "aiogram\dispatcher\event\telegram.py", line 121, in trigger
            File "aiogram\dispatcher\event\handler.py", line 43, in call
        File "aiogram\dispatcher\dispatcher.py", line 276, in _listen_update
        File "aiogram\dispatcher\router.py", line 146, in propagate_event
       File "aiogram\dispatcher\router.py", line 141, in _wrapped
      File "aiogram\dispatcher\router.py", line 174, in _propagate_event
        File "aiogram\dispatcher\router.py", line 146, in propagate_event
 File "aiogram\dispatcher\router.py", line 141, in _wrapped
   File "aiogram\dispatcher\router.py", line 166, in _propagate_event
       File "aiogram\dispatcher\event\telegram.py", line 121, in trigger
        File "aiogram\dispatcher\event\handler.py", line 43, in call
      File "app\handlers.py", line 35, in cmd_help
          File "aiogram\methods\base.py", line 84, in emit
       File "aiogram\client\bot.py", line 488, in __call__
        File "aiogram\client\session\base.py", line 254, in __call__
        File "aiogram\client\session\aiohttp.py", line 188, in make_request
     aiogram.exceptions.TelegramNetworkError: HTTP Client говорит - ClientOSError: [Errno 2] Не удается записать тело запроса для https://api.telegram.org/bottoken:) /sendPhoto

`

Я пытался указать путь по-другому и изменить данные в –add-data

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что при компиляции вашего кода с помощью PyInstaller путь к файлу изображения недоступен, что приводит к ошибке FileNotFoundError. Давайте разберем несколько шагов, которые помогут вам исправить эту проблему.

Решение проблемы с путями к файлам

  1. Проверка файловой структуры: Убедитесь, что файл изображения image.jpg действительно существует в каталоге app/other/, когда вы запускаете ваш боты как скомпилированное исполняемое приложение.

  2. Использование getattr для получения правильного пути:
    Когда вы используете PyInstaller, файлы будут упакованы в исполняемый файл, и вам необходимо получать к ним доступ с помощью специальной функции, например, sys._MEIPASS, чтобы получить базовый путь, где файл распакован.

    Обновите ваш код для отправки изображения следующим образом:

    import os
    import sys
    from aiogram import Router
    from aiogram.types import FSInputFile
    from aiogram.dispatcher import FSMContext
    from aiogram.types import Message
    from aiogram.utils import CommandStart
    
    router = Router()
    
    @router.message(CommandStart())
    async def cmd_help(message: Message, state: FSMContext):
       await state.clear()
       # Определяем путь к файлу изображения
       if getattr(sys, 'frozen', False):
           # Если программа запущена из исполняемого файла
           file_path = os.path.join(sys._MEIPASS, 'other', 'image.jpg')
       else:
           # Если программа запущена из исходного кода
           file_path = os.path.join('app', 'other', 'image.jpg')
    
       await message.reply_photo(photo=FSInputFile(path=file_path))

    В этом коде мы проверяем, запущен ли скрипт в режиме фрозена (с помощью PyInstaller), и в зависимости от этого выбираем правильный путь к файлу.

  3. Корректная команда для PyInstaller:
    Используйте следующую команду PyInstaller, чтобы обеспечить правильную упаковку всех необходимых ресурсов. Убедитесь, что у вас есть правильные кавычки и путь:

    pyinstaller --onefile --add-data "C:/Users/Admin/Desktop/tgbot/app/other/image.jpg;other" -F -i "path/to/icon.ico" main.py

    Важно: путь к изображению в --add-data должен содержать файл без звездочки, и вы должны указать подкаталог, в который этот файл будет располагаться.

  4. Запуск:
    После создания исполняемого файла, вы можете запустить его и проверить, отправляет ли бот изображение без ошибок.

Выводы

  1. Проблема возникала из-за неправильного пути к файлу изображения в скомпилированном приложении.
  2. Корректное использование sys._MEIPASS позволяет получить доступ ко всем файлам, упакованным с использованием PyInstaller.
  3. Убедитесь, что команда PyInstaller правильно формирует структуру папок.

В результате этих изменений ваш бот должен корректно отправлять изображения. Если после выполнения всех шагов проблемы продолжатся, проверьте логи и пути к файлам снова.

Оцените материал
Добавить комментарий

Капча загружается...