使用PyInstaller打包EXE时导入自定义包遇文件找不到错误
问题原因与解决方法
为什么会出现临时路径的错误?
PyInstaller打包时会把所有Python代码和依赖打包成一个可执行文件,运行时会自动解压到系统临时目录(就是报错里的C:\\Users\\LUTZMO~1\\AppData\\Local\\Temp\\_MEIxxxxxx\\路径),然后在这个临时目录里执行程序。
你的问题有两个核心原因:
- 代码中使用相对路径读取
xliff.json,本地运行时路径正确,但打包后程序的工作目录或文件结构变化,导致路径失效; - PyInstaller默认不会自动打包
.json这类非Python代码的资源文件,所以xliff.json没有被包含到EXE中,自然在临时目录找不到。
解决步骤
1. 修正资源文件的读取逻辑
不要用相对路径,而是基于包的位置获取资源的绝对路径,推荐用Python3.7+内置的importlib.resources模块:
import json from importlib.resources import files # 在xliff.py中修改读取xliff.json的代码 def load_xliff_namespaces(): # 获取包内资源的路径 json_file = files("ldm.xliff.data.namespaces").joinpath("xliff.json") with open(json_file, 'r', encoding='utf-8') as f: return json.load(f)
如果需要兼容Python3.7以下版本,可以用pkg_resources:
import json import pkg_resources def load_xliff_namespaces(): json_path = pkg_resources.resource_filename("ldm.xliff.data.namespaces", "xliff.json") with open(json_path, 'r', encoding='utf-8') as f: return json.load(f)
2. 让PyInstaller包含资源文件
有两种方法可以告诉PyInstaller要打包xliff.json:
方法一:命令行直接指定
假设你的项目结构如下:
your_project/ ├── ldm/ │ ├── xliff/ │ │ ├── __init__.py │ │ ├── xliff.py │ │ └── data/ │ │ └── namespaces/ │ │ └── xliff.json └── pre_tran.py
执行打包命令时用--add-data参数:
# Windows系统用分号分隔源路径和目标路径 pyinstaller --add-data "ldm/xliff/data/namespaces/xliff.json;ldm/xliff/data/namespaces/" pre_tran.py # Linux/macOS系统用冒号分隔 pyinstaller --add-data "ldm/xliff/data/namespaces/xliff.json:ldm/xliff/data/namespaces/" pre_tran.py
方法二:使用.spec文件(更灵活)
- 先生成spec文件:
pyinstaller --name pre_tran pre_tran.py
- 打开生成的
pre_tran.spec,找到datas列表,添加资源文件的映射:
a = Analysis( ['pre_tran.py'], pathex=[], binaries=[], # 在这里添加datas datas=[('ldm/xliff/data/namespaces/xliff.json', 'ldm/xliff/data/namespaces')], ... )
- 用spec文件重新打包:
pyinstaller pre_tran.spec
3. 验证打包结果
运行生成的EXE文件,如果仍有错误,可以临时在代码中打印资源文件的路径,确认是否与临时目录中的实际路径一致,排查路径是否配置正确。
内容的提问来源于stack exchange,提问作者user15446651
相关产品推荐
相关产品推荐

