PyInstaller打包生成的exe运行时提示找不到iapws/VERSION文件报错
问题原因
hiddenimports配置仅能告知PyInstaller收集Python格式的模块代码,iapws包内的VERSION是无后缀的纯文本资源文件,不属于Python代码模块,PyInstaller默认不会自动打包这类资源,因此单文件模式运行时解压到临时_MEI开头的目录后,程序找不到对应路径下的VERSION文件触发报错。
可行解决方法
以下方法任选其一即可,修改配置后请先删除旧的build、dist目录清空打包缓存,再重新执行打包命令避免缓存干扰。
- 方法1:直接修改spec文件的datas配置(最直接)
先找到本地Python环境中iapws库的安装位置,通常在site-packages/iapws路径下,确认该目录下存在VERSION文件。打开你的myScript.spec文件,找到Analysis配置块的datas字段,添加VERSION文件的打包规则,示例配置如下:
配置中元组的第二个参数必须填a = Analysis( ['myScript.py'], pathex=[], binaries=[], datas=[ # 替换第一个路径为你本地iapws/VERSION文件的实际绝对路径 ('C:/Python310/Lib/site-packages/iapws/VERSION', 'iapws') ], hiddenimports=['iapws'], # 其余配置保持原有内容不变即可 hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False, )iapws,保证打包后文件会被解压到_MEIxxx/iapws/VERSION路径,和程序读取的路径完全匹配。 - 方法2:自定义PyInstaller hook(一劳永逸,适合后续可能用到iapws其他资源的场景)
在项目根目录新建名为hooks的文件夹,在文件夹内新建hook-iapws.py文件,写入以下内容:
之后打开from PyInstaller.utils.hooks import collect_data_files # 自动收集iapws包下所有非代码类资源文件 datas = collect_data_files('iapws')myScript.spec,找到hookspath字段,配置为你新建的hooks目录路径:
这种方式不需要手动找VERSION文件路径,PyInstaller会自动识别iapws的所有资源文件,后续iapws版本更新新增其他资源也不需要重复修改配置。hookspath=['./hooks'], - 方法3:命令行直接传参打包(不想改spec时用)
打包时直接在命令中添加--add-data参数指定要打包的资源文件,Windows环境下命令示例:
注意Windows系统下pyinstaller --onefile --hiddenimport=iapws --add-data "C:/Python310/Lib/site-packages/iapws/VERSION;iapws" myScript.py--add-data参数的本地路径和打包后目标路径用分号;分隔,不要写错为其他符号。
注意事项
不要直接把整个iapws库的完整目录全部加入datas,容易出现代码重复、版本不匹配的问题,优先选择精准添加缺失文件、或者用官方提供的collect_data_files方法自动收集资源的方式,稳定性更高。
内容的提问来源于stack exchange,提问作者Miguel Rodriguez
相关产品推荐
相关产品推荐

