Python pathlib:观察符号链接与绝对路径

举报
yd_237867988 发表于 2026/11/08 01:18:12 2026/11/08
【摘要】 通过临时目录和符号链接,验证 pathlib 中 absolute 与 resolve 的区别及其使用边界。

在处理配置文件或缓存目录时,两个看起来不同的路径可能通过符号链接指向同一个位置。Python 的 pathlib 提供 absolute() 和 resolve(),两者都能得到绝对路径,但处理符号链接的方式不同。

一个可重复的实验

下面的代码在临时目录中创建真实目录和一个指向它的符号链接。file 不必事先存在:resolve() 默认使用 strict=False。

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as tmp:
    root = Path(tmp)
    real = root / "real"
    real.mkdir()
    link = root / "link"
    link.symlink_to(real, target_is_directory=True)
    path = link / "file"
    print("absolute:", path.absolute())
    print("resolve: ", path.resolve())

本地 Python 3.10 运行时,前者保留 link/file,后者指向 real/file。在 macOS 上临时目录本身也可能包含符号链接,因此 resolve 的前缀也可能变化。Windows 创建符号链接可能需要开发者模式或相应权限。

如何选择

absolute() 适合保留用户输入的路径结构,同时补全当前工作目录;它不会解析符号链接。resolve() 会解析已有路径组件中的符号链接并消除 ..,适合需要规范化路径的场景。resolve(strict=True) 要求路径存在,否则会抛出 FileNotFoundError;默认的非严格模式允许末尾不存在,因此不能用它证明文件已经创建。

对真实存在的文件,判断是否是同一个文件可使用 Path.samefile();仅比较路径字符串可能遗漏硬链接等情况。处理不可信路径时,路径检查与后续打开文件之间仍可能发生变化,单次 resolve 不是完整的安全边界。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。