Python脚本内获取源文件路径,如何不受os.chdir操作影响?
问题根源
os.path.abspath()会基于当前工作目录计算相对路径,若脚本以相对路径启动,__file__本身存储的就是相对路径,切换工作目录后重新计算路径就会出现偏差。
可用方案
方案1:初始化阶段提前缓存绝对路径(兼容所有Python版本,适配Python 3.8.10环境)
在脚本刚启动、还未执行任何os.chdir操作时,就把源文件的绝对路径、所在目录路径提前存入全局变量,后续所有场景直接调用该变量即可,不受工作目录切换影响:
import os # 脚本启动第一时间缓存路径,后续不再重新计算 SCRIPT_ABS_PATH = os.path.abspath(__file__) SCRIPT_PARENT_DIR = os.path.dirname(SCRIPT_ABS_PATH) # 切换工作目录后仍然输出正确路径 os.chdir("..") print(SCRIPT_PARENT_DIR) print(SCRIPT_ABS_PATH)
方案2:使用pathlib缓存路径(Python 3.4及以上版本支持,写法更简洁)
from pathlib import Path import os # 提前解析为绝对路径并缓存 SCRIPT_PATH = Path(__file__).resolve() SCRIPT_PARENT_DIR = SCRIPT_PATH.parent os.chdir("..") print(SCRIPT_PARENT_DIR) print(SCRIPT_PATH)
补充说明
目前不存在无需缓存、每次动态计算还能保证路径正确的方法。因为__file__的取值是Python解释器启动时确定的:如果用相对路径启动脚本,__file__本身就是相对路径,每次计算绝对路径都会依赖当前工作目录,提前缓存是目前最通用的稳定解决方案。
内容的提问来源于stack exchange,提问作者reducing activity
相关产品推荐
相关产品推荐

