Python修改sys.path入口点后相对路径读取文件报错如何解决
错误原因
报错本质是相对路径解析规则和模块导入规则是完全独立的两套机制:
- 修改的
sys.path仅作用于Python模块导入的搜索逻辑,因此from app import func可以正常执行 - 文件读取时的相对路径,是相对于**运行脚本时的当前工作目录(CWD,即执行命令所在的目录)**拼接的,和代码文件本身所在的存储位置无关
从web根目录启动测试时,当前工作目录是web/,open('sets.json', 'r')会尝试读取web/sets.json,但该文件实际存储在web/api/sets.json,因此触发文件不存在错误。
解决方案
方案1(推荐):在app.py中基于文件自身路径构造绝对路径
该方案完全不依赖运行脚本的工作目录,兼容性最优。修改app.py代码如下:
import os def func(): # 获取当前app.py文件所在目录的绝对路径 app_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到sets.json的绝对路径 sets_path = os.path.join(app_dir, 'sets.json') with open(sets_path, 'r') as file: ...
方案2:测试脚本中临时切换工作目录
适合不想修改app.py代码的场景,修改test.py代码如下:
import sys import os original_cwd = os.getcwd() sys.path.append(os.path.join(original_cwd, 'api')) from app import func # 调用func前切换工作目录到api目录 os.chdir(os.path.join(original_cwd, 'api')) func() # 执行完成后可切回原工作目录,避免影响后续逻辑 os.chdir(original_cwd)
方案3(不推荐):修改文件读取路径为相对web根目录的路径
仅适合永远固定从web根目录运行程序的场景,修改app.py的open逻辑:
def func(): with open('api/sets.json', 'r') as file: ...
内容的提问来源于stack exchange,提问作者Alex Poloz
相关产品推荐
相关产品推荐

