pyinstaller exe 识别相对路径而不是绝对路径

Mak*_*akJ 5 python windows pyinstaller pathlib

我正在使用 pyinstaller 从脚本创建 EXE。脚本和exe的位置如下:

脚本:root-dir\subdir1\subdir2\src\scriptabc.py

exe:root-dir\subdir1\subdir2\exe\scriptabc.exe

要创建 Exe,我从 Exe 目录运行 cmd 命令。

pyinstaller -F -i ABC.ico "..\src\scriptabc.py" 
Run Code Online (Sandbox Code Playgroud)

生成的文件在 Exe 文件夹中正确创建,可执行文件在 dist 文件夹中。然后我将可执行文件复制到 Exe 文件夹中,使其与 src\scriptabc.py 文件处于相同的深度级别,并参考根目录。

当我运行 exe 时,我使用相对路径的所有代码项,例如

wb_assets = load_workbook(filename = '..//input//01_assets.xlsx')
Run Code Online (Sandbox Code Playgroud)

运行就好。

但是,当代码使用 pathlib 进行绝对路径评估时,它失败并显示以下错误:

File "pathlib.py", line 587, in __getitem__
IndexError: 3
[8920] Failed to execute script scriptabc
Run Code Online (Sandbox Code Playgroud)

我正在使用 pathlib 建立根目录的绝对路径,如下所示:

from pathlib import Path

abspath = Path(__file__).resolve() # resolve to relative path to absolute
rootpath = abspath.parents[3] # root-dir
Run Code Online (Sandbox Code Playgroud)

一旦我建立了根路径,有很多代码会为其他子目录创建路径。

所以这个索引号在使用 src*.py 文件夹时工作正常 为什么它会为位于 exe*.exe 文件夹中的 exe 出错?

文件选项仅看脚本文件名?因为如果是深度的话,exe和src文件夹的深度是完全一样的。

如果我将粘贴复制到 src 文件夹中并从那里运行,则 exe 工作正常。在我的 exe 发行版中,我根本不想有 src 文件夹,如果可能,只需让代码从 exe 文件夹运行。

有人可以帮忙吗?

问题的第二部分是我正在寻找完全包含所有 dll 文件的规范脚本(我希望它们捆绑在 exe 中,而不是在每台计算机上安装 redist 包。我的计算机中有 SDK 和所有必需的 dll 文件)。我需要为此再问一个问题吗?