使用os.walk避免无限递归

时间:2016-05-02 07:34:13

标签: python recursion os.walk

我正在使用os.walkfollowlinks=True,但我遇到了一个符号链接引用它自己的目录的地方,导致无限循环。在这种情况下,罪魁祸首是/usr/bin/X11,其列表如下:

lrwxrwxrwx 1 root root           1 Apr 24  2015 X11 -> .

有没有办法避免跟随...的链接,我认为这会导致类似的问题?我想我可以用os.readlink检查一下,然后与当前路径进行比较。还有其他解决办法吗?

2 个答案:

答案 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模块的人员遇到了同样的问题并使用了所描述的方法。补丁在链接中;)

相关问题