Python加载shader文件报FileNotFoundError如何解决
问题现象
主Python脚本存放在shader代码文件夹的外层目录,代码中通过相对路径加载shader文件:
self.shader = self.createShader("shaders/vertex.txt", "shaders/fragment.txt")
运行时直接抛出文件不存在错误:
FileNotFoundError: [Errno 2] No such file or directory: 'shaders/vertex.txt'
核心原因
Python代码中写的相对路径,默认以程序启动时的工作目录为解析基准,不是以Python脚本自身所在的目录为基准。绝大多数这类报错都是因为运行脚本时的工作目录,和写路径时预期的基准目录不一致。
排查步骤
- 先定位实际生效的工作目录:在调用shader加载逻辑前加两行代码,打印当前程序识别到的工作目录:
import os print(os.getcwd())
运行后拿到输出的路径,到对应路径下检查是否存在shaders/vertex.txt,基本能立刻定位路径偏移问题。常见触发场景包括:在终端其他目录下跨路径调用脚本、IDE运行配置默认把工作目录设为项目根目录而非脚本所在目录。
- 核对文件名、文件夹名拼写:Linux/macOS系统严格区分大小写,检查是否把
shaders拼成了shader,同时留意系统是否开了后缀名隐藏,导致实际文件是vertex.txt.txt这类和代码写法不匹配的情况。 - 核对目录层级:确认shaders文件夹没有被误移动到其他位置,也没有多嵌套一层子目录。
可靠修复方案
不要硬编码相对路径,改为基于当前脚本文件的绝对位置拼接shader路径,不管从什么目录启动脚本都不会出现路径错误,还能自动适配不同操作系统的路径分隔符:
import os # 获取当前脚本文件所在的绝对目录 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接shader文件的完整路径 vertex_shader_path = os.path.join(SCRIPT_DIR, "shaders", "vertex.txt") fragment_shader_path = os.path.join(SCRIPT_DIR, "shaders", "fragment.txt") self.shader = self.createShader(vertex_shader_path, fragment_shader_path)
如果只是临时调试,也可以在运行脚本前先通过cd命令切到脚本所在目录再执行脚本,或是修改IDE运行配置里的Working directory为脚本所在目录,但这两种方式换运行环境就容易复现问题,不推荐作为长期方案。
内容的提问来源于stack exchange,提问作者Artur Moszczyński
相关产品推荐
相关产品推荐

