我正在尝试捆绑用Python编写的应用程序,并将相关的数据文件包含在捆绑中。我添加数据的方式有什么问题?
这是使用规范文件来排除某些库并包括数据文件。我运行cmd pyinstaller --onefile main.spec
# -*- mode: python -*-
block_cipher = None
added_data = [('file_one.pickle', '.'),
('file_two.pickle', '.'),
('file_three.pickle', '.')]
excluded_libraries = [XXX]
a = Analysis(['main.py'],
pathex=['C:\\Users\\XXX\\XXX\\XXX\\XXX\\Folder'],
binaries=[],
datas=added_data,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=excluded_libraries,
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='main')
当我运行.exe
时,程序将运行,直到需要捆绑的文件为止。但是,如果我将文件放在与.exe
答案 0 :(得分:1)
捆绑文件的方式很好,但是我建议您将add-data
标志与构建参数一起使用。我认为您的问题出在检索文件的方式上。
根据{{3}}:
捆绑的应用程序启动时,引导程序会设置sys.frozen 属性,并将束文件夹的绝对路径存储在
sys._MEIPASS
。对于单文件夹捆绑包,这是实现这一目标的途径 夹。对于一个文件包,这是临时文件的路径 引导程序创建的文件夹。
因此,将文件捆绑在一起,PyInstaller会将它们解压缩到临时目录中,例如C:/Users/<Username>/AppData/Local/Temp/_MEIxxxxxx
。您需要从那里检索文件。
import os
import sys
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
if __name__ == "__main__":
file_one_path = resource_path("file_one.pickle")
file_two_path = resource_path("file_two.pickle")
file_three_path = resource_path("file_three.pickle")