st_ino 是文件在所在文件系统中的 inode 编号,同一挂载点内唯一标识文件实体;跨设备不可比,判断同一文件需同时比对 st_dev 和 st_ino。

os.stat 返回的 st_ino 是什么
os.stat 返回的 st_ino 字段是文件系统中该文件的 inode 编号,它在同一个挂载点内唯一标识一个文件(包括硬链接指向的同一 inode)。注意:不同分区或挂载点的 inode 编号可能重复,st_ino 本身不跨设备全局唯一。
常见误解是认为 st_ino 能直接用于“判断两个路径是否指向同一文件”,这只有在它们属于同一文件系统时才可靠。跨挂载点比较 st_ino 没有意义。
用 os.stat 获取 inode 的最小可行代码
直接调用 os.stat(path).st_ino 即可,但必须处理路径不存在或权限不足的异常:
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
import os
try:
inode = os.stat("/path/to/file").st_ino
print(inode)
except FileNotFoundError:
print("路径不存在")
except PermissionError:
print("无权访问该路径")
-
os.stat不跟随符号链接 —— 如果传入的是软链接,返回的是链接文件自身的 inode,不是目标文件的 - 若需获取符号链接指向的目标 inode,改用
os.lstat(返回链接自身)或os.stat(自动解引用后返回目标) - Windows 上虽然也返回
st_ino,但其值是模拟生成的、无实际文件系统意义,不可用于唯一性判断
判断两个路径是否为同一文件(硬链接 or 同一实体)
正确做法是同时比对 st_dev(设备号)和 st_ino,缺一不可:
import os
def same_file(p1, p2):
try:
s1 = os.stat(p1)
s2 = os.stat(p2)
return s1.st_dev == s2.st_dev and s1.st_ino == s2.st_ino
except (OSError, FileNotFoundError):
return False
- 只比
st_ino会误判跨分区同编号的文件 - 只比
st_dev会把同一设备上所有文件都当成相同 - 符号链接需明确使用
os.stat(解引用)还是os.lstat(不解除),根据业务意图选择
inode 变化场景与稳定性提醒
inode 并非永久不变 —— 文件被移动(mv)到另一文件系统时,会分配新 inode;cp + rm 也会导致 inode 改变;而同一文件系统内的 rename 不改变 inode。
- 备份工具或去重逻辑依赖 inode 时,必须确认操作未跨挂载点
- 通过
os.stat频繁轮询 inode 来检测文件变更不可靠,推荐用mtime或ctime配合st_size - 容器或网络文件系统(如 NFS、SMB)中,
st_ino行为可能受限或不一致,不要假设其语义完全等同于本地 ext4/xfs
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










