You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自动设置的脚本路径变量):

两种写法的差异

  1. Path(__file__).parent

    • 若运行脚本时用的是相对路径(如 python ../scripts/script.py),则返回相对路径的父目录(如 ../scripts);若用绝对路径运行,则返回绝对路径的父目录。
    • 不会解析符号链接:如果脚本是符号链接,此写法返回符号链接所在的目录,而非真实脚本文件的目录。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:38:21