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

跨机器运行Python脚本遇FileNotFoundError:旧路径残留问题排查

问题描述

在机器A(Windows 2019 Server,运行RDS)上开发基于fpdf库的Python脚本,开发流程如下:

  • 安装Python 3.11.0
  • 进入目录python_proj/project1
  • 创建venv虚拟环境并安装依赖
  • 执行命令>& .\.venv\Scripts\python.exe .\main.py运行正常
  • 添加.gitignore规则:env Pipfile.lock *.log __pycache__/ .venv*

将代码提交至GitLab后,在机器B(Windows 11)和机器C克隆项目运行时出现错误:

...
File "C:\Users\johndoe\python\project1\.venv\Lib\site-packages\fpdf\ttfonts.py", line 459, in makeSubset
    self.fh = open(file ,'rb')
              ^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\johndoe\\python_proj\\project1\\assets\\fonts\\Lora\\static\\Lora-Regular.ttf'

错误路径指向机器A的旧目录python_proj,但代码中已使用os.path动态构建路径:

def __init__(self, app_path='main.py'):
    self.dirname = os.path.dirname(app_path)
    self.individual_receipts_fonts_lora_regular = os.path.join(self.dirname, 'assets' + os.path.sep + 'fonts'  + os.path.sep + 'Lora/static/Lora-Regular.ttf')
排查方向与解决办法

1. 清理fpdf字体缓存文件

fpdf库会生成字体缓存文件(通常名为.fpdf-fonts.cache或类似),如果该文件被意外提交到Git仓库,克隆到其他机器后会读取旧的路径缓存:

  • 检查Git仓库中是否存在这类缓存文件,若存在则删除并提交删除操作
  • 将.fpdf-fonts.cache添加到.gitignore规则中
  • 在机器B/C上删除本地项目目录下的所有fpdf缓存文件,重新运行脚本

2. 修正路径构建逻辑

代码中混合使用了os.path.sep和硬编码的/分隔符,且依赖默认参数app_path='main.py'可能导致路径计算错误:

  • 改用全os.path.join拼接路径,同时使用脚本绝对路径避免工作目录影响:
def __init__(self, app_path=None):
    if app_path is None:
        app_path = os.path.abspath(__file__)  # 获取当前脚本的绝对路径
    self.dirname = os.path.dirname(app_path)
    self.individual_receipts_fonts_lora_regular = os.path.join(
        self.dirname,
        'assets',
        'fonts',
        'Lora',
        'static',
        'Lora-Regular.ttf'
    )

3. 统一依赖包版本

机器A与B/C的Python小版本差异(3.11.0 vs 3.11.4)可能伴随fpdf等依赖包版本不一致,导致缓存机制行为不同:

  • 在机器A上导出精确的依赖版本到requirements.txt:
    .\.venv\Scripts\pip freeze > requirements.txt
    
  • 将requirements.txt提交到Git仓库,在机器B/C上通过该文件安装依赖:
    .\.venv\Scripts\pip install -r requirements.txt
    

4. 确认运行脚本的工作目录

确保运行脚本时的工作目录为项目根目录,避免os.path.dirname('main.py')返回空路径或错误目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:33