使用pyinstaller将数据包含在规范文件中

时间:2019-08-22 13:54:18

标签: python pyinstaller

我正在尝试捆绑用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

相同的目录中,则程序将完全运行

1 个答案:

答案 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")