使用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.py
。 data.py
将 file1.txt
解析为构造函数的一部分。
我想 运行 gui.py
作为 windows 中的可执行文件,因此使用 pyinstaller。
data.py
使用相对路径打开 file1.txt
:file1_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.py
在 lib
中对 files
进行操作。您不需要在 pyinstaller
命令中包含 lib
,只需将它与编译后的 exe 文件放在同一个文件夹中,它会自动查找文件,就像在您的 data.py
中一样;如果你愿意,你可以将它们(lib 中的文件)作为 datas
包含在你的规范文件中,这样这些文件将在编译时被复制到目标文件夹(exe 文件所在的同一文件夹),但它确实没必要。
同时删除 -p
,因为您所有的脚本(gui.py
和 data.py
)都在同一文件夹中,无需告诉 pyinstaller
搜索 imports
在其他地方。
我有一个 python 项目,其中包含以下文件树:
\main_dir
gui.py
data.py
\lib
\files
file1.txt
file2.txt
... more_dirs and files in lib.
gui.py
导入 data.py
。 data.py
将 file1.txt
解析为构造函数的一部分。
我想 运行 gui.py
作为 windows 中的可执行文件,因此使用 pyinstaller。
data.py
使用相对路径打开 file1.txt
:file1_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.py
在 lib
中对 files
进行操作。您不需要在 pyinstaller
命令中包含 lib
,只需将它与编译后的 exe 文件放在同一个文件夹中,它会自动查找文件,就像在您的 data.py
中一样;如果你愿意,你可以将它们(lib 中的文件)作为 datas
包含在你的规范文件中,这样这些文件将在编译时被复制到目标文件夹(exe 文件所在的同一文件夹),但它确实没必要。
同时删除 -p
,因为您所有的脚本(gui.py
和 data.py
)都在同一文件夹中,无需告诉 pyinstaller
搜索 imports
在其他地方。