Ошибка в скомпилированном файле Python

Код работает без ошибок в IDE. Но после компиляции и запуска, появляется ошибка:

[ WARN:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('A:\Python\PR\output\progres_bar.png'): can't open/read file: check file path/integrity
Traceback (most recent call last):
  File "bot.py", line 24, in run
  File "v3.py", line 74, in start
    progress_bar = pga.locateOnScreen(progres_bar_img, confidence=0.6, region=(right_down_screen_size))
  File "pyautogui\__init__.py", line 175, in wrapper
  File "pyautogui\__init__.py", line 213, in locateOnScreen
  File "pyscreeze\__init__.py", line 373, in locateOnScreen
  File "pyscreeze\__init__.py", line 353, in locate
  File "pyscreeze\__init__.py", line 207, in _locateAll_opencv
  File "pyscreeze\__init__.py", line 170, in _load_cv2
OSError: Failed to read A:\Python\PR\output\progres_bar.png because file is missing, has improper permissions, or is an unsupported or invalid format

Компилирую через auto-py-to-exe. Команда для компиляцию выглядит так:

pyinstaller --noconfirm --onefile --console --add-data "A:/Python/PR/progres_bar.png;." --add-data "A:/Python/PR/ui.py;." --add-data "A:/Python/PR/v3.py;."  "A:/Python/PR/main.py"

В коде путь к файлу прописан вот так:

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

progres_bar_img = resource_path("progres_bar.png")

Ответы (1 шт):

Автор решения: n1tr0xs

Ваши файлы, добавленные ключом(ами) --add-data, упаковуются в тот же exe потому что вы указали, что хотите получить один файл.
Вы можете это увидеть, если пройдете по пути, который хранится в переменной __file__. В этой папке будут все ваши файлы, добавленные ключом(ами) --add-data.


Вариант 1:
Изменить текущий рабочий каталог. Это позволит вам открывать файлы как вы это делали раньше, например:

import os
os.chdir('/'.join(__file__.split('\\')[:-1]))

with open('some.txt', 'r') as file: 
    text = file.read()

Вариант 2:
Можно перед каждым обращением к файлу прописывать этот путь. Это выглядит так:

__FILE__PATH__ = '/'.join(__file__.split('\\')[:-1]) + '/'

with open(__FILE__PATH__+'some.txt', 'r') as file: 
    text = file.read()
→ Ссылка