Python中使用pyinstaller打包程序时,如何将外部的pickle文件一起打包进exe?

代码中, 导入了一个外链的 pickle 腌制文件, 因为需要使用 pickle 文件中的数据, 但是使用 pyinstaller 打包后, 发现如果我 将那个外链的 pickle 文件改了名字, 这个 exe 文件就会失效, 提示找不到 那个 pickle 了.


我在网上搜索, 没有发现任何人 有这个问题的提出. 不知道该怎么解决了, 只能求助于大家, 怎么把外链导入的文件,一起打包进 exe 中?
Python中使用pyinstaller打包程序时,如何将外部的pickle文件一起打包进exe?

1 回复

在PyInstaller打包时,将外部pickle文件打包进exe,可以通过修改spec文件或使用--add-data参数实现。这里提供两种方法:

方法一:使用命令行参数(推荐)

# 假设你的项目结构如下:
# project/
#   main.py
#   data.pkl

# 打包命令:
pyinstaller --onefile --add-data "data.pkl;." main.py

在Windows中使用分号;分隔路径,Linux/Mac用冒号:。打包后需要在代码中通过sys._MEIPASS访问资源:

import sys
import os
import pickle

def load_data():
    if getattr(sys, 'frozen', False):
        # 打包后运行
        base_path = sys._MEIPASS
    else:
        # 开发环境运行
        base_path = os.path.dirname(__file__)
    
    data_path = os.path.join(base_path, 'data.pkl')
    with open(data_path, 'rb') as f:
        return pickle.load(f)

方法二:修改spec文件

  1. 首先生成spec文件:
pyinstaller --onefile main.py
  1. 编辑生成的main.spec,在a = Analysis()部分添加datas参数:
a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[('data.pkl', '.')],  # 添加这行
    hiddenimports=[],
    hookspath=[],
    ...
)
  1. 重新打包:
pyinstaller main.spec

两种方法都能将pickle文件嵌入exe,运行时文件会被解压到临时目录,通过sys._MEIPASS访问即可。

总结:用--add-data参数最方便。

回到顶部