Kaputte symlinks mit Python
Wenn ich den Anruf os.stat()
auf eine gebrochene symlink
python wirft ein OSError
Ausnahme. Dies macht es nützlich für Sie zu finden. Allerdings gibt es ein paar andere Gründe, die os.stat()
auslösen könnte eine ähnliche Ausnahme. Gibt es eine genauere Möglichkeit zur Erkennung gebrochen symlinks
mit Python unter Linux?
InformationsquelleAutor der Frage postfuturist | 2008-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer gemeinsamen Python zu sagen ist, dass es einfacher ist, um Vergebung zu bitten als Zustimmung. Ich bin zwar kein fan von dieser Aussage im wirklichen Leben, es gilt in vielen Fällen. In der Regel will man vermeiden, dass code, Ketten zwei-system-Aufrufe auf die gleiche Datei, weil Sie nie wissen, was passieren wird, um die Datei zwischen Ihrem zwei Anrufe in Ihrem code.
Ein typischer Fehler ist, etwas zu schreiben, wie:
Den zweiten Anruf (os.unlink) kann fehlschlagen, wenn etwas anderes gelöscht, es nach der if-test, der eine Ausnahme auslösen, und beenden Sie den rest der Funktion auszuführen. (Man könnte denken, dies nicht im wirklichen Leben passieren, aber wir fischten ein bug wie der, dass aus unserer codebase Letzte Woche - und es war die Art von Fehler, dass Links ein paar Programmierer, kratzen sich den Kopf und fordern 'Heisenbug' für die letzten paar Monate)
So, in deinem speziellen Fall, würde ich wohl auch tun:
Ärgernis hier ist, dass die stat wieder die gleichen Fehler-code für einen symbolischen Link, die ist einfach nicht da und eine kaputte symlink.
So, ich denke, Sie haben keine andere Wahl als zu brechen, die die Unteilbarkeit, und etwas tun, wie
InformationsquelleAutor der Antwort Thomas Vander Stichele
os.lstat() kann hilfreich sein. Wenn lstat() erfolgreich und stat() fehlschlägt, dann ist es wahrscheinlich ein defekter link.
InformationsquelleAutor der Antwort Greg Hewgill
Dies ist nicht atomar, aber es funktioniert.
os.path.islink(filename) and not os.path.exists(filename)
In der Tat von RTFM
(Lesen Sie das fantastische Handbuch) wir sehen
Er sagt auch:
Also, wenn Sie sind besorgt über die Berechtigungen, die Sie hinzufügen sollte, andere Bestimmungen.
InformationsquelleAutor der Antwort am70
Kann ich erwähnen, Tests für hardlinks ohne python? /bin/test ist der DATEI1 -ef DATEI2 Bedingung, die true ist, wenn Dateien, die Freigabe einer inode.
Daher so etwas wie
find . -type f -exec test \{} -ef /path/to/file \; -print
Werke für hard-link-Tests, um eine bestimmte Datei.Das bringt mich zu Lesen
man test
und die Erwähnungen von-L
und-h
die beide auf eine Datei und gibt true zurück, wenn die Datei ein symbolischer link ist, allerdings wissen Sie noch nicht, wenn das Ziel fehlt.Fand ich, dass
head -0 FILE1
zurückkehren würde einen exit-code von0
wenn die Datei geöffnet werden kann und ein1
wenn es nicht, was im Falle eines symbolischen Links auf eine reguläre Datei funktioniert als test, ob es das Ziel gelesen werden können.InformationsquelleAutor der Antwort dlamblin
os.Pfad
Sie können versuchen, mit realpath() zu bekommen, was der symlink zeigt, dann versuchen zu bestimmen, ob Sie eine gültige Datei verwendet, ist Datei.
(Ich bin nicht in der Lage, um zu versuchen, die im moment, also müssen Sie spielen, um mit ihm und sehen, was Sie erhalten)
InformationsquelleAutor der Antwort Jason Baker
Ich bin kein python-guy, aber es sieht aus wie os.readlink()? Die Logik, die ich verwenden würde, in perl ist die Verwendung von readlink() zu finden, das Ziel und die Verwendung stat() zu testen, um zu sehen, ob das Ziel existiert.
Edit: ich schlug einige perl, demos readlink. Ich glaube perl-stat und readlink-und python os.stat() und os.readlink()sind Wrapper für das system fordert, so sollte dies übersetzen angemessen gut als proof-of-concept-code:
InformationsquelleAutor der Antwort jj33
Ich hatte ein ähnliches problem: wie fangen broken symlinks, auch wenn Sie sich in einige übergeordnete dir? Wollte ich auch melden Sie sich für alle von Ihnen (in einer Anwendung, die den Umgang mit einem ziemlich großen Anzahl von Dateien), aber ohne allzu viele Wiederholungen.
Hier ist was ich kam mit, einschließlich unit-tests.
fileutil.py:
Unit-tests:
InformationsquelleAutor der Antwort Pierre D