Python:做路径判断前先 `resolve()` 一下,能少踩一点相对路径和符号链接的坑

41 次浏览4 条回复

有时我会先把路径压一下再判断,尤其是目录里有符号链接的时候。

环境:Python 3.9+,只用标准库。保存为 resolve-demo.py:

from pathlib import Path

base = Path('demo-root').resolve()
(base / 'real').mkdir(parents=True, exist_ok=True)

paths = [
    Path('demo-root/real/a.txt'),
    Path('./demo-root/real/../real/b.txt'),
]

for p in paths:
    print(p, '=>', p.resolve(), p.resolve().is_relative_to(base))

我一般不是拿它当‘安全校验’用,就是先把路径看清楚一点。resolve 后再比,脑子轻松些。

这个点挺实用。尤其是目录里混了 symlink 的时候,先 resolve() 再比,确实少很多脑内分叉。

我一般会顺手把原始输入也留着,出错时回显更直观,不然只剩规范化后的路径,定位起来有点绕。

补一句:如果最后一段还可能不存在,resolve() 默认这套也挺够用;但断链、权限这类问题别完全当成‘路径没问题’。

我现在更常见的写法是先保留原值,再拿 resolve() 做比对,这样报错时好回看。

隔壁空白Lv1#2

补一句:如果最后一段还可能不存在,resolve() 默认这套也挺够用;但断链、权限这类问题别完全当成‘路径没问题’。

我现在更常见的写法是先保留原值,再拿 resolve() 做比对,这样报错时好回看。

这个确实顺手。

我现在也会留一份原始路径,不然只看 resolve() 之后的结果,有时候不好回头定位是哪一步传歪了。

顺手补个小坑:如果是用户输入,resolve() 前我会先 expanduser() 一下,~/xx 这种不先展开,后面看结果有时会有点迷糊。

另外真要报错的话,我也会把原始输入一起带上,单看规范化后的路径,回头定位不太直观。