使用os.walk避免无限递归

Eri*_*ric 4 python recursion os.walk

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

lrwxrwxrwx 1 root root           1 Apr 24  2015 X11 -> .
Run Code Online (Sandbox Code Playgroud)

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

Die*_*Epp 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)
Run Code Online (Sandbox Code Playgroud)