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文件
- 首先生成spec文件:
pyinstaller --onefile main.py
- 编辑生成的
main.spec,在a = Analysis()部分添加datas参数:
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('data.pkl', '.')], # 添加这行
hiddenimports=[],
hookspath=[],
...
)
- 重新打包:
pyinstaller main.spec
两种方法都能将pickle文件嵌入exe,运行时文件会被解压到临时目录,通过sys._MEIPASS访问即可。
总结:用--add-data参数最方便。

