use*_*434 4 python executable exe pyinstaller
我也第一次尝试构建一个简单的 --onefile exe,其中包含数据文件,但 Pyinstaller 在构建 .exe 时似乎没有找到它们。--onedir 构建似乎工作正常。
我此时也在使用 --debug 开关。我能够运行 onefile 可执行文件,并且可以看到它似乎开始工作。该程序可以正常找到 (sys._MEIPASS) 临时目录(按照指示打印所需的目录名称),但在从临时目录查找第一个数据文件时报告“没有此类文件或目录”错误。我在 .exe 上使用 archiveviewer.py 并没有在那里找到所需的数据文件 - 这似乎是问题所在,但我不明白为什么。构建的数据文件位于规范文件描述的目录中。我的完整规格文件是
# -*- mode: python -*-
a = Analysis(['develop6.py'],
pathex=['C:\\PYINST20'],
hiddenimports=[],
hookspath=None)
a.datas += [ ('conlist.txt', 'C:\\pyinst20\\conlist.txt', 'DATA'), ('imageblank.gif', 'C:\\pyinst20\\imageblank.gif', 'DATA')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'develop6.exe'),
debug=True,
strip=None,
upx=True,
console=True )
Run Code Online (Sandbox Code Playgroud)
(这个问题很旧,但它是我发现解决同一问题的唯一来源之一,我将在这里分享我的解决方案,以防它可以帮助别人)
要在 --onefile 模式下将数据文件添加到脚本中,需要做两件主要的事情。
在脚本中,调整路径以查找包中的数据文件。根据此处的PyInstaller 文档,可执行文件是从临时文件启动的,因此您的路径必须处理此动态部分:
对于具有以下相对路径的文件:./your/file/is/here.ext
代码将是:
import sys
wd = sys._MEIPASS
file_path = os.path.join(wd,<your>,<file>,<is>,<here>)
Run Code Online (Sandbox Code Playgroud)
注意:要使您的代码也适用于其他上下文,您可以执行以下操作:
import sys
import os
try:
wd = sys._MEIPASS
except AttributeError:
wd = os.getcwd()
file_path = os.path.join(wd,<your>,<file>,<is>,<here>)
Run Code Online (Sandbox Code Playgroud)
根据此处的PyInstaller 文档,有两种方法可以将数据文件添加到捆绑包中:
从脚本目录运行时将选项--add-files和文件作为参数传递pyinstaller <yourscript.py>
首先通过导航到脚本目录并运行来生成规范文件pyi-makespec <yourscript.py>,然后将文件添加到元组列表中data=[]。元组包含文件的实际路径和包内的路径。如果您遵循第一点,这应该看起来像
datas = [('/your/file/is/here.ext','/your/file/is/')]
然后PyInstall <yourscript.spec>根据您的规格文件运行以构建捆绑包。