You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyinstaller打包exe出现FileNotFoundError问题求助

解决PyInstaller打包onefile后currency_converter模块资源文件找不到的问题

你遇到的核心问题是:PyInstaller打包单文件exe时,没能正确把currency_converter模块依赖的eurofxref-hist.zip资源文件包含进去。直接跑Python脚本时,模块能从site-packages目录找到这个zip,但打包成单文件后,程序会临时解压到Temp目录,这时候资源路径的解析就出了问题。

下面是几个实用的解决办法:

方法1:用--add-data参数强制打包资源文件

这是最直接的方案,通过PyInstaller的命令行参数指定要包含的资源,同时定义解压后的路径结构:

  1. 先找到你的Python环境中currency_converter模块的安装路径,比如C:\PythonXX\Lib\site-packages\currency_converter,里面就能找到eurofxref-hist.zip。
  2. 修改打包命令,加入--add-data参数:
    pyinstaller --onefile --add-data "C:\PythonXX\Lib\site-packages\currency_converter\eurofxref-hist.zip;currency_converter" RFOutputGraphs.py
    
    注意Windows系统用分号;分隔源路径和目标路径,这条命令会把zip文件打包进exe,运行时自动解压到临时目录下的currency_converter子文件夹里,和原脚本的路径结构一致。

方法2:修改代码适配PyInstaller的临时路径

如果模块内部的路径是硬编码的相对路径,你可以在脚本里添加路径适配逻辑,让程序不管是直接运行还是打包后都能找到资源:

  1. 在脚本开头加入这段路径处理函数:
    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)
    
  2. 找到代码中调用currency_converter涉及zip文件的部分,把路径替换成get_resource_path("currency_converter/eurofxref-hist.zip")。如果是模块内部调用,你可以用猴子补丁的方式替换模块里的路径变量,或者临时修改模块源码(记得备份)。

方法3:用.spec文件自定义打包配置

如果需要更精细的打包控制,可以生成并修改.spec文件:

  1. 先生成基础的.spec文件:
    pyinstaller --onefile RFOutputGraphs.py
    
  2. 打开生成的RFOutputGraphs.spec,找到datas字段,添加资源文件的配置:
    datas = [('C:\PythonXX\Lib\site-packages\currency_converter\eurofxref-hist.zip', 'currency_converter')]
    
  3. 用.spec文件重新打包:
    pyinstaller RFOutputGraphs.spec
    

优先试试方法1,大部分情况下都能解决问题。如果还是不行,再考虑修改代码或.spec文件的方案。

内容的提问来源于stack exchange,提问作者Nicholas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:42:05