PyInstaller打包导入extruct的Python程序为exe运行报错如何修复
问题根因
报错是extruct依赖的mf2py库包含非代码类的规则资源目录backcompat-rules,PyInstaller默认的依赖收集逻辑只会识别Python代码文件,不会自动打包这类静态资源目录,导致exe运行时解压到临时目录后找不到对应路径,触发FileNotFoundError。
修复方法
- 第一步:定位本地
mf2py库的安装路径
打开你打包用的Python环境对应的Lib/site-packages/mf2py目录,确认目录下存在backcompat-rules文件夹,复制这个文件夹的完整本地路径。如果使用虚拟环境,就进入虚拟环境目录下的Lib/site-packages/mf2py查找。 - 第二步:打包时追加资源收集参数
执行PyInstaller打包命令时,通过--add-data参数把上述目录强制打包进exe,Windows系统下路径用分号分隔源路径和运行时的目标路径,命令格式如下:
举个实际例子,如果你的mf2py安装在pyinstaller --add-data "本地backcompat-rules目录完整路径;mf2py/backcompat-rules" 你的Python脚本文件名.pyC:\Python39\Lib\site-packages\mf2py,脚本名为test.py,对应命令为:pyinstaller --add-data "C:\Python39\Lib\site-packages\mf2py\backcompat-rules;mf2py/backcompat-rules" test.py - 可选:用spec文件固定配置
如果需要多次打包,可以在项目目录下生成/编辑PyInstaller的spec配置文件,在Analysis段的datas列表中加入资源路径配置:
后续直接执行a = Analysis( ['test.py'], pathex=[], binaries=[], # 加入下面这行配置,替换成你本地的实际路径 datas=[('C:/Python39/Lib/site-packages/mf2py/backcompat-rules', 'mf2py/backcompat-rules')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )pyinstaller test.spec即可完成打包,不需要每次输入长串参数。
打包完成后双击生成的exe文件,即可正常运行,不会再触发该路径找不到的报错。
内容的提问来源于stack exchange,提问作者user19541198
相关产品推荐
相关产品推荐

