Pyinstaller EXE определяет относительные пути, но не абсолютный путь - PullRequest
0 голосов
/ 04 января 2019

Я использую 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 на моем компьютере).Нужно ли мне задать еще один вопрос?

...