Я использую 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 имеют одинаковую глубину.
exe отлично работает, если я копирую paste в папку src и запускаю оттуда.В моем дистрибутиве exe я просто не хочу иметь папку src, просто позвольте коду запускаться из папки exe, если это возможно.
Может кто-нибудь помочь с этим?
Вторая часть вопроса заключается в том, что я ищу spec-скрипт, который полностью включает все dll-файлы (я хочу, чтобы они были связаны в exe-файле вместо установки пакета redist на каждом компьютере. У меня есть SDK и всенеобходимые файлы DLL на моем компьютере).Нужно ли мне задать еще один вопрос?