Вопрос или проблема
У меня есть этот код для отправки изображения
@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
. Давайте разберем несколько шагов, которые помогут вам исправить эту проблему.
Решение проблемы с путями к файлам
-
Проверка файловой структуры: Убедитесь, что файл изображения
image.jpg
действительно существует в каталогеapp/other/
, когда вы запускаете ваш боты как скомпилированное исполняемое приложение. -
Использование
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
), и в зависимости от этого выбираем правильный путь к файлу. -
Корректная команда для
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
должен содержать файл без звездочки, и вы должны указать подкаталог, в который этот файл будет располагаться. - Запуск:
После создания исполняемого файла, вы можете запустить его и проверить, отправляет ли бот изображение без ошибок.
Выводы
- Проблема возникала из-за неправильного пути к файлу изображения в скомпилированном приложении.
- Корректное использование
sys._MEIPASS
позволяет получить доступ ко всем файлам, упакованным с использованиемPyInstaller
. - Убедитесь, что команда
PyInstaller
правильно формирует структуру папок.
В результате этих изменений ваш бот должен корректно отправлять изображения. Если после выполнения всех шагов проблемы продолжатся, проверьте логи и пути к файлам снова.