pathlib.Path.resolve()与Path.parent的区别及脚本目录获取疑问
pathlib.Path.resolve() 与 Path.parent 的区别及应用场景
基础定义差异
- Path.parent:仅返回当前路径的直接父目录,不对路径做任何解析——不管路径是相对/绝对、是否存在、是否为符号链接,都直接取上层目录。
例:Path("../docs/readme.md").parent返回../docs(相对路径);Path("/usr/bin/python").parent返回/usr/bin(绝对路径)。 - Path.resolve():将路径解析为绝对路径,同时递归解析所有符号链接,最终返回指向真实文件/目录的绝对路径。
例:在/home/user目录下执行Path("./project/script.py").resolve(),返回/home/user/project/script.py;如果script.py是指向/opt/scripts/main.py的符号链接,resolve()会直接返回/opt/scripts/main.py。
获取当前脚本所在目录:二者功能不同
首先要明确:直接用 Path() 调用的是当前工作目录(CWD),不是脚本所在目录。正确获取脚本目录的方式是基于 __file__(Python自动设置的脚本路径变量):
两种写法的差异
Path(__file__).parent- 若运行脚本时用的是相对路径(如
python ../scripts/script.py),则返回相对路径的父目录(如../scripts);若用绝对路径运行,则返回绝对路径的父目录。 - 不会解析符号链接:如果脚本是符号链接,此写法返回符号链接所在的目录,而非真实脚本文件的目录。
- 若运行脚本时用的是相对路径(如
Path(__file__).resolve().parent- 无论用相对/绝对路径运行脚本,都会先解析为绝对路径,再取父目录,最终得到真实脚本所在的绝对目录。
- 会解析符号链接:即使脚本是符号链接,也能指向真实文件所在的目录。
举个实际例子(脚本位于 /home/user/project/script.py):
from pathlib import Path # 从 /home/user 目录运行:python project/script.py print(Path(__file__).parent) # 输出: project print(Path(__file__).resolve().parent)# 输出: /home/user/project
位置无关性:移动文件后的表现
Path(__file__).parent- 若脚本被移动,只要运行时工作目录与脚本的相对关系不变,或者用绝对路径运行,能正确获取新目录;但如果脚本运行后改变了工作目录,且之前的
parent是相对路径,后续用该路径拼接文件时会指向错误位置。 - 若脚本是符号链接,移动符号链接后,此写法会指向符号链接新的所在目录,而非真实脚本目录。
- 若脚本被移动,只要运行时工作目录与脚本的相对关系不变,或者用绝对路径运行,能正确获取新目录;但如果脚本运行后改变了工作目录,且之前的
Path(__file__).resolve().parent- 具备完全的位置无关性:无论脚本被移到哪个路径、运行时工作目录如何变化,都能通过绝对路径正确指向当前脚本所在的真实目录,移动后脚本仍能正常运行。
- 即使符号链接被移动,只要真实脚本文件的位置不变,仍能正确指向真实目录。
总结:如果需要稳定获取脚本所在目录,优先用 Path(__file__).resolve().parent,它的鲁棒性更强,不受工作目录、符号链接的影响。
内容的提问来源于stack exchange,提问作者CharlieCCC
相关产品推荐
相关产品推荐

