python - 使用 pyinstaller 在规范文件中包含数据
问题描述
我正在尝试捆绑一个用 Python 编写的应用程序,并在捆绑包中包含相关的数据文件。我添加数据的方式有什么问题?
这是使用规范文件来排除某些库并包含数据文件。我运行 cmdpyinstaller --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
解决方案
您捆绑文件的方式很好,但我建议您将add-data
标志与构建参数一起使用。我认为您的问题在于您检索文件的方式。根据文档:
当捆绑的应用程序启动时,引导加载程序设置 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")
推荐阅读
- sql - Group By 的 SQL 问题。根据情况选择PK
- javascript - HTML CSS 网站不移动导航栏
- javascript - 是什么让我无法访问这些 JSON 数据?(p5.js)
- sql - 使用隐式游标编写一个 PL/SQL 程序,在屏幕上显示整个表 OILPRICE 和第三列
- bash - sed 从多行转换为单行不起作用
- c - 打印到 stderr 未达到 stderr
- mysql - 将列表从 S3 传递到 Athena 查询
- next.js - 有没有办法让 Formik 使用 NextJS 在 Internet Explorer 11 中工作
- python - C# 是否有与 Python 的 random.choices() 等价的东西
- sql - 如何在 RLIKE Hive 中转义单引号?双单引号不起作用