跨机器运行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
相关产品推荐
相关产品推荐

