import os
def isLink(a, b):
return os.path.islink(a) and os.path.realpath(a) == os.path.realpath(b)
请注意,这会将第二个参数解析为真实路径。a
因此,如果和b
都是符号链接,只要它们都指向相同的真实路径,它将返回 True 。如果你不想b
被解析到真正的路径,那么改变
os.path.realpath(a) == os.path.realpath(b)
至
os.path.realpath(a) == os.path.abspath(b)
现在,如果a
指向b
和b
指向c
,并且您isLink(a, b)
仍然希望为 True,那么您将要使用os.readlink(a)
而不是os.path.realpath(a)
:
def isLink(a, b):
return os.path.islink(a) and os.path.abspath(os.readlink(a)) == os.path.abspath(b)
os.readlink(a)
计算结果为b
,即指向的下一个链接a
,而os.path.realpath(a)
计算结果为,指向c
的最终路径a
。
例如,
In [129]: !touch z
In [130]: !ln -s z x
In [131]: !touch w
In [132]: !ln -s w y
In [138]: isLink('x', 'z')
Out[138]: True
In [139]: isLink('y', 'z')
Out[139]: False
In [140]: isLink('z', 'z')
Out[140]: False