首页 > 解决方案 > 使用 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

标签: pythonpyinstaller

解决方案


您捆绑文件的方式很好,但我建议您将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")

推荐阅读