修改manifest后PyInstaller打包Python exe报380 Ordinal not found如何解决
故障环境与现象
- 运行环境:Python 3.7、PyInstaller 4.5、Windows 10
- 触发操作:修改PyInstaller打包生成的exe配套manifest文件名后改回原名称
- 故障表现:应用持续报错
380 Ordinal not found无法启动;同路径同文件名重装应用故障依旧,修改安装路径或exe文件名后应用可正常运行
根本原因
故障与PyInstaller打包逻辑无关,是Windows系统两类持久化缓存的机制特性导致:
- SxS并行程序集清单缓存:Windows首次启动带manifest配置的可执行文件时,会以exe的完整绝对路径+文件名作为唯一索引,将manifest解析结果、依赖运行库/COM组件的版本匹配关系存入WinSxS缓存库。你修改manifest后首次启动时,系统解析到无效的依赖配置,将错误的依赖匹配关系写入了对应索引的缓存条目;后续哪怕你把manifest改回正确版本,系统启动时会优先读取缓存中的错误记录,不会重新加载磁盘上的正确manifest,最终因为缓存记录的DLL导出序号和实际文件不匹配,抛出序数找不到的错误。
- AppCompat应用兼容性缓存:系统为加快应用启动速度,会按相同的“绝对路径+文件名”索引,记录每个启动过的exe的兼容性垫片配置、文件校验结果。你启动损坏配置的exe时,系统给对应索引的条目打上了配置异常的标记,后续启动直接走预设的错误分支,不会重新校验磁盘上的文件完整性。
两类缓存都不会因为同路径同名文件的覆盖安装自动更新,因此重装后故障会持续存在;修改路径或文件名相当于生成了全新的缓存索引,系统找不到旧的错误缓存,会重新读取磁盘上的正确配置,应用即可正常启动。
解决方法
方案1:刷新系统SxS缓存(优先选择)
- 以管理员身份打开命令提示符,依次执行以下命令:
sfc /scannow Dism.exe /online /Cleanup-Image /StartComponentCleanup
- 命令执行完成后重启电脑,原路径下的应用即可正常启动。
方案2:手动清理对应AppCompat缓存
- 按
Win+R输入regedit打开注册表编辑器,定位到以下两个路径,找到和故障exe完整绝对路径匹配的条目,直接删除:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\LayersHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
- 再定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache路径,清空该键下的缓存值(操作前建议备份对应注册表项,避免配置异常)。 - 重启电脑后重新启动应用即可。
方案3:清理PyInstaller临时运行残留
PyInstaller打包的单文件exe启动时会在系统临时目录生成_MEIxxxxxx格式的解压缓存,损坏配置启动时生成的残留文件也可能导致启动异常:
- 在资源管理器地址栏输入
%temp%回车打开临时目录 - 删除所有名称以
_MEI开头的文件夹,再重新启动应用即可。
临时绕过方案:如果不需要保留原安装路径和原文件名,直接修改exe文件名、或将应用移动到其他目录,即可绕过旧缓存直接正常启动。
内容的提问来源于stack exchange,提问作者Uncle Bob
相关产品推荐
相关产品推荐

