Python pathlib:观察符号链接与绝对路径
【摘要】 通过临时目录和符号链接,验证 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)