最直接判断软链接用os.path.islink(),它只检查路径是否为符号链接而不关心目标存在与否;需区分链接自身与目标时用os.stat(follow_symlinks=False);多数场景推荐pathlib.Path配合is_symlink()、is_file()、is_dir()组合判断。

用 os.path.islink() 检查是否为软链接
这是最直接的方式:它只判断路径本身是否指向一个符号链接(symlink),不关心目标是否存在。只要 ln -s 创建过,哪怕目标被删了,os.path.islink() 仍返回 True。
常见错误是把它和 os.path.exists() 混用——比如先 islink() 再 exists(),但其实你真正想问的可能是“这个路径最终指向一个真实文件吗”,那得往下看。
-
os.path.islink('/path/to/symlink')→True(即使目标已删除) -
os.path.islink('/path/to/real/file')→False - 注意:Windows 上需启用开发者模式并使用支持 symlink 的 Python 版本(3.8+),否则始终返回
False
用 os.path.isfile() 和 os.path.isdir() 判断“最终指向”是否为文件或目录
这两个函数默认跟随软链接(即解析 symlink 后检查目标),所以它们回答的是“这条路径最终通向一个真实文件吗?”,而不是“路径本身是不是文件”。这是多数人实际需要的逻辑。
例如:/usr/bin/python3 很可能是个软链接,但 os.path.isfile('/usr/bin/python3') 返回 True,因为它最终指向一个可执行文件。
立即学习“Python免费学习笔记(深入)”;
- 如果软链接目标不存在,
os.path.isfile()返回False(不是因为它是链接,而是因为目标没了) - 若想绕过链接、只检查“路径自身是否为文件(不跟随)”,得用
pathlib.Path('/p').is_file(follow_symlinks=False)(Python 3.9+) - 旧版本 Python 只能靠
os.stat()+stat.S_ISREG()配合follow_symlinks=False实现
用 os.stat() + follow_symlinks=False 获取链接本身的元信息
当你需要区分“链接本身”和“链接指向的目标”时,os.stat() 是底层可控的选择。加 follow_symlinks=False 参数后,它读取的是软链接文件自身的属性(比如创建时间、大小 ≈ 路径字符串长度),而不是目标的。
这在审计、备份或调试链接异常时很关键——比如发现某个 .so 文件明明是链接,但 stat 显示大小只有 20 字节,你就知道它只是个壳。
-
os.stat('/path/to/link', follow_symlinks=False).st_size返回链接路径字符串长度(如b'../lib/libc.so.6'的字节数) -
os.stat('/path/to/link', follow_symlinks=True)(默认)返回目标文件的 size、mtime 等 - 出错场景:目标不存在时,
follow_symlinks=True会抛FileNotFoundError;而follow_symlinks=False通常能成功(只要链接文件自身存在)
推荐组合判断逻辑
多数脚本里不需要单独纠结“是不是链接”,而是要安全地做后续操作——比如读取内容前确认它真是个普通文件,或者备份时保留链接结构。这时候别堆砌多个 os.path.*,用一次 pathlib.Path 更清晰。
Python 3.4+ 推荐写法:
from pathlib import Path
p = Path('/some/path')
if p.is_symlink():
target = p.readlink() # 注意:不是 .resolve()
print(f"Link to: {target}")
elif p.is_file():
print("Regular file")
elif p.is_dir():
print("Directory")
else:
print("Does not exist or is special file (e.g., pipe, device)")
p.readlink() 是关键:它不尝试解析,只原样读出链接内容;而 p.resolve() 会递归跟随直到真实路径,中间任一环断裂就报错。很多人误用 resolve() 导致脚本在坏链接上崩溃。


















