我正在使用os.walk
和followlinks=True
,但我遇到了一个符号链接引用它自己的目录的地方,导致无限循环。在这种情况下,罪魁祸首是/usr/bin/X11
,其列表如下:
lrwxrwxrwx 1 root root 1 Apr 24 2015 X11 -> .
有没有办法避免跟随.
或..
的链接,我认为这会导致类似的问题?我想我可以用os.readlink
检查一下,然后与当前路径进行比较。还有其他解决办法吗?
答案 0 :(得分:5)
如果要避免递归,则无法避免存储所访问的所有目录集。您不需要使用readlink
,但是,您可以只存储inode。这完全避免了路径规范化的问题。
import os
dirs = set()
for dirpath, dirnames, filenames in os.walk('.', followlinks=True):
st = os.stat(dirpath)
scandirs = []
for dirname in dirnames:
st = os.stat(os.path.join(dirpath, dirname))
dirkey = st.st_dev, st.st_ino
if dirkey not in dirs:
dirs.add(dirkey)
scandirs.append(dirname)
dirnames[:] = scandirs
print(dirpath)
答案 1 :(得分:2)
要完全避免无限递归的问题(链接指向哪里),您需要存储已访问过的文件和/或目录。
来自pynotify模块的人员遇到了同样的问题并使用了所描述的方法。补丁在链接中;)