使用pyinstaller打包可执行文件python时如何添加相对目录?

How to add relative directory while packaging executable python with pyinstaller?

我有一个 python 项目,其中包含以下文件树:

\main_dir
    gui.py
    data.py
    \lib
        \files
            file1.txt
            file2.txt
     ... more_dirs and files in lib.

gui.py 导入 data.pydata.pyfile1.txt 解析为构造函数的一部分。 我想 运行 gui.py 作为 windows 中的可执行文件,因此使用 pyinstaller。

data.py 使用相对路径打开 file1.txtfile1_dir = os.path.join(os.path.curdir, "lib", "files")

我运行以下命令:

pyinstaller "..fullpath..\main_dir\gui.py" -p "..fullpath..\main_dir\" --runtime-hook "..fullpath..\main_dir\lib"

pyistaller 成功打包 data.py 但是当 运行 可执行文件时出现以下错误:

"FileNotFoundError: 系统找不到指定的路径: '.\lib\files\'

我试图将钩子更改为 <fullpath>\main_dir\lib\files 但得到了同样的错误。

我做错了什么?如何将相对目录和文件添加到可执行文件?

如果我理解正确的话,你不需要使用 --runtime-hook,例如,它用于 运行 在你的主脚本启动之前 另一个脚本如果您在命令中添加 --runtime-hook=file1.py,则在 运行 时的执行顺序将是:1) 运行 file1.py, 2) 运行 您的主脚本。 (当然它们已经 compiled/packed 成一个 exe 文件了)

因此,在您的情况下,您使用 gui.py 导入 data.py,并且 data.pylib 中对 files 进行操作。您不需要在 pyinstaller 命令中包含 lib,只需将它与编译后的 exe 文件放在同一个文件夹中,它会自动查找文件,就像在您的 data.py 中一样;如果你愿意,你可以将它们(lib 中的文件)作为 datas 包含在你的规范文件中,这样这些文件将在编译时被复制到目标文件夹(exe 文件所在的同一文件夹),但它确实没必要。

同时删除 -p,因为您所有的脚本(gui.pydata.py)都在同一文件夹中,无需告诉 pyinstaller 搜索 imports 在其他地方。