recursion limit von os.walk()?
Verfasst: Dienstag 14. November 2017, 11:36
Moin moin!
Ich habe mir mal eben den Spaß gemacht und absichtlich eine infinite recursion Situation geschaffen, über welches ich dann os.walk(path, followlinks=True) laufen lasse:
[codebox=bash file=Unbenannt.bsh]
$ tree -a
.
└── dir1
├── dir2
│ ├── dir3
│ │ ├── dir4 -> ../../../dir1
│ │ ├── file3
│ │ └── file3.conf
│ ├── file2
│ └── file2.conf
├── file1
└── file1.conf
4 directories, 6 files
$ [/code]
Zusammen mit folgendem Python Code:
Soll halt rekursiv alle Dateien die auf das Pattern *.conf matchen finden und in einer Liste ausgeben; klappt auch! Durch das "followlinks=True" auch schön rekursiv ... laut Logik des Codes und der Doku dazu sollte das auch "infinite" sein:
Einen Fehler gibt es jedoch scheinbar nicht.
Weiß zufällig jemand was mich da "rettet" - ist es tatsächlich ein Verzeichnistiefen-Limit in os.walk()? Falls ja: Das scheint "hart" zu sein; sprich: Kann man dem als Lektion entnehmen das Verzeichnisse maximal 40 Ebenen tief sein dürfen?
Ich habe mir mal eben den Spaß gemacht und absichtlich eine infinite recursion Situation geschaffen, über welches ich dann os.walk(path, followlinks=True) laufen lasse:
[codebox=bash file=Unbenannt.bsh]
$ tree -a
.
└── dir1
├── dir2
│ ├── dir3
│ │ ├── dir4 -> ../../../dir1
│ │ ├── file3
│ │ └── file3.conf
│ ├── file2
│ └── file2.conf
├── file1
└── file1.conf
4 directories, 6 files
$ [/code]
Zusammen mit folgendem Python Code:
Code: Alles auswählen
def find(pattern, path):
result = []
for root, dirs, files in os.walk(path, followlinks=True):
for name in files:
if fnmatch.fnmatch(name, pattern):
result.append(os.path.join(root, name))
return result
find('*.conf', PATH)
Ich hätte also einen Absturz erwartet. Stattdessen scheint die resultierende Liste jedoch maximal 120 Einträge zu umfassen; also das sollte, bei obiger Struktur, ja einer Verzeichnistiefe von 40 entsprechen, wenn ich mich nicht vertue (3 "Treffer" pro Durchlauf, also: 120 / 3 = 40).Note Be aware that setting followlinks to True can lead to infinite recursion if a link points to a parent directory of itself. walk() does not keep track of the directories it visited already.
Einen Fehler gibt es jedoch scheinbar nicht.
Weiß zufällig jemand was mich da "rettet" - ist es tatsächlich ein Verzeichnistiefen-Limit in os.walk()? Falls ja: Das scheint "hart" zu sein; sprich: Kann man dem als Lektion entnehmen das Verzeichnisse maximal 40 Ebenen tief sein dürfen?