如何让Python代码不受启动目录影响,固定使用指定工作目录
Python跨启动目录访问资源解决方案
核心逻辑是不依赖运行时的当前工作目录,基于当前脚本文件的固定绝对路径推导所有资源路径,两种常用实现方案如下:
方案1:固定切换全局工作目录(适配现有硬编码路径)
适合已经写了很多基于项目根目录的相对路径,不想逐个修改的场景,只需要在入口脚本main.py最开头加入以下代码:
from pathlib import Path import os # 推导项目根目录:当前main.py所在目录是core,上级目录就是project_name根目录 PROJECT_ROOT = Path(__file__).absolute().parent.parent # 强制切换当前工作目录到项目根目录 os.chdir(PROJECT_ROOT)
加入后无论从哪个目录启动脚本,程序的工作目录都会固定为project_name,后续访问资源直接写根目录下的相对路径即可:
- 访问user.json:
config/userconfig/user.json - 访问log.txt:
log/log.txt
方案2:所有路径基于根目录变量拼接(更稳妥无副作用)
不想修改全局工作目录的场景,直接定义统一的根路径变量,所有资源路径都通过根路径拼接得到:
from pathlib import Path # 全局唯一的项目根目录变量 PROJECT_ROOT = Path(__file__).absolute().parent.parent # 提前定义所有资源的绝对路径,直接复用即可 USER_CONFIG_PATH = PROJECT_ROOT / "config" / "userconfig" / "user.json" SYSTEM_CONFIG_PATH = PROJECT_ROOT / "config" / "systemconfig" / "system.json" LOG_PATH = PROJECT_ROOT / "log" / "log.txt"
后续访问资源直接调用对应变量即可,完全不受启动目录影响。
兼容低版本Python的os.path实现
如果使用Python3.4以下版本,没有内置pathlib,可以用os.path模块实现相同逻辑:
import os # 推导项目根目录 PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 拼接资源路径 USER_CONFIG_PATH = os.path.join(PROJECT_ROOT, "config", "userconfig", "user.json")
内容的提问来源于stack exchange,提问作者Saranraj K
相关产品推荐
相关产品推荐

