Pyinstaller EXE определяет относительные пути, но не абсолютный путь
Я использую pyinstaller для создания EXE из скрипта. Расположение скрипта и исполняемого файла:
Скрипт: root-dir \ subdir1 \ subdir2 \ src \ scriptabc.py
Exe: root-dir \ subdir1 \ subdir2 \ exe \ scriptabc.exe
Для создания Exe я запускаю команды cmd из каталога Exe.
pyinstaller -F -i ABC.ico "..\src\scriptabc.py"
Полученные файлы правильно создаются в папке Exe, а исполняемый файл - в папке dist. Затем я копирую исполняемый файл в папку Exe, чтобы он находился на том же уровне глубины, что и файл src \ scriptabc.py, со ссылкой на root.
Когда я запускаю exe, все элементы кода, где я использовал относительные пути, такие как
wb_assets = load_workbook(filename = '..//input//01_assets.xlsx')
беги просто отлично.
Тем не менее, когда код приходит к оценке абсолютного пути с использованием pathlib, происходит сбой со следующей ошибкой:
File "pathlib.py", line 587, in __getitem__
IndexError: 3
[8920] Failed to execute script scriptabc
Я использую pathlib, чтобы установить абсолютный путь к корневому каталогу следующим образом:
from pathlib import Path
abspath = Path(__file__).resolve() # resolve to relative path to absolute
rootpath = abspath.parents[3] # root-dir
Существует много кода, который затем создает пути для других подкаталогов, когда я устанавливаю rootpath.
Таким образом, этот индекс хорошо работает при работе с папкой src *.py. Почему тогда он выдает ошибку для исполняемого файла, сидящего в папке exe *.exe?
Опция file только смотрит на имя файла скрипта? Потому что, если это глубина, папки exe и src имеют одинаковую глубину.
Отлично работает, если я скопирую вставить в папку src и запустить оттуда. В моем дистрибутиве exe я просто не хочу иметь папку src, просто позвольте коду запускаться из папки exe, если это возможно.
Может кто-нибудь, пожалуйста, помогите с этим?
Вторая часть вопроса заключается в том, что я ищу spec-скрипт, который полностью включает все dll-файлы (я хочу, чтобы они были упакованы в exe-файл, а не устанавливал пакет redist на каждом компьютере. У меня есть SDK и все необходимые dll-файлы на моем компьютере). Нужно ли мне задать еще один вопрос?