Pyinstaller打包exe出现FileNotFoundError问题求助
解决PyInstaller打包onefile后currency_converter模块资源文件找不到的问题
你遇到的核心问题是:PyInstaller打包单文件exe时,没能正确把currency_converter模块依赖的eurofxref-hist.zip资源文件包含进去。直接跑Python脚本时,模块能从site-packages目录找到这个zip,但打包成单文件后,程序会临时解压到Temp目录,这时候资源路径的解析就出了问题。
下面是几个实用的解决办法:
方法1:用--add-data参数强制打包资源文件
这是最直接的方案,通过PyInstaller的命令行参数指定要包含的资源,同时定义解压后的路径结构:
- 先找到你的Python环境中
currency_converter模块的安装路径,比如C:\PythonXX\Lib\site-packages\currency_converter,里面就能找到eurofxref-hist.zip。 - 修改打包命令,加入
--add-data参数:
注意Windows系统用分号pyinstaller --onefile --add-data "C:\PythonXX\Lib\site-packages\currency_converter\eurofxref-hist.zip;currency_converter" RFOutputGraphs.py;分隔源路径和目标路径,这条命令会把zip文件打包进exe,运行时自动解压到临时目录下的currency_converter子文件夹里,和原脚本的路径结构一致。
方法2:修改代码适配PyInstaller的临时路径
如果模块内部的路径是硬编码的相对路径,你可以在脚本里添加路径适配逻辑,让程序不管是直接运行还是打包后都能找到资源:
- 在脚本开头加入这段路径处理函数:
import sys import os def get_resource_path(relative_path): """获取资源文件的正确路径,适配打包/非打包场景""" try: # 打包成exe时,PyInstaller会设置_MEIPASS变量指向临时解压目录 base_path = sys._MEIPASS except Exception: # 未打包时,用当前脚本所在目录作为基准路径 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) - 找到代码中调用
currency_converter涉及zip文件的部分,把路径替换成get_resource_path("currency_converter/eurofxref-hist.zip")。如果是模块内部调用,你可以用猴子补丁的方式替换模块里的路径变量,或者临时修改模块源码(记得备份)。
方法3:用.spec文件自定义打包配置
如果需要更精细的打包控制,可以生成并修改.spec文件:
- 先生成基础的.spec文件:
pyinstaller --onefile RFOutputGraphs.py - 打开生成的
RFOutputGraphs.spec,找到datas字段,添加资源文件的配置:datas = [('C:\PythonXX\Lib\site-packages\currency_converter\eurofxref-hist.zip', 'currency_converter')] - 用.spec文件重新打包:
pyinstaller RFOutputGraphs.spec
优先试试方法1,大部分情况下都能解决问题。如果还是不行,再考虑修改代码或.spec文件的方案。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

