PyInstaller打包Python程序后运行报错:缺失user_agent相关JSON文件
问题分析
这个错误是因为PyInstaller默认不会自动打包依赖库的静态资源文件——你提到的user_agent/data/smartphone_dev_id.json是user_agent库的内置资源(被wrpy或requests间接调用),打包时没被包含到exe中,导致运行时临时解压后找不到文件,且错误出现在你的代码执行前,说明是依赖库初始化阶段就需要读取这个文件。
解决方法
方案1:手动指定资源打包(推荐)
- 找到你的conda环境中
user_agent库的安装路径,Windows下一般是{你的conda环境文件夹}/Lib/site-packages/user_agent,比如C:\Users\你的用户名\.conda\envs\你的环境名\Lib\site-packages\user_agent - 生成PyInstaller的spec配置文件(如果还没生成过):
pyi-makespec 你的脚本文件名.py - 打开生成的
你的脚本文件名.spec,修改datas参数,把user_agent的data目录添加进去:
注意替换成你自己的实际路径,Windows路径加datas = [ (r"C:\Users\你的用户名\.conda\envs\你的环境名\Lib\site-packages\user_agent\data", "user_agent/data") ]r前缀避免转义出错 - 用spec文件重新打包:
pyinstaller 你的脚本文件名.spec
方案2:修改代码路径(临时调试用)
- 在代码最开头(所有导入wrpy、requests之前)添加这段代码,手动覆盖
user_agent的资源路径:import sys import os from pathlib import Path # 判断是否是PyInstaller打包后的环境 if getattr(sys, 'frozen', False): base_path = sys._MEIPASS # 打包后的临时解压目录 else: base_path = os.path.dirname(os.path.abspath(__file__)) # 开发环境的脚本目录 # 手动设置user_agent的资源目录 import user_agent user_agent.DATA_DIR = Path(base_path) / "user_agent" / "data"
方案3:用--add-data参数直接打包
- 不需要生成spec文件,直接在打包命令里加资源路径:
# Windows系统用分号分隔源和目标路径 pyinstaller --add-data "C:\Users\你的用户名\.conda\envs\你的环境名\Lib\site-packages\user_agent\data;user_agent/data" 你的脚本文件名.py
内容的提问来源于stack exchange,提问作者Vénon
相关产品推荐
相关产品推荐

