wake-up-neo.com

wie finde ich die Zieldatei mit dem vollständigen (absoluten) Pfad des symbolischen Links oder Softlinks in Python?

wenn ich ls -l /etc/fonts/conf.d/70-yes-bitmaps.conf gebe

lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf

so finden Sie für einen symbolischen Link oder einen Softlink den vollständigen (absoluten) Pfad der Zieldatei in Python.

Wenn ich benutze

os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')

es gibt aus

../conf.avail/70-yes-bitmaps.conf

aber ich brauche den absoluten Pfad nicht den relativen Pfad, also muss meine gewünschte Ausgabe sein,

/etc/fonts/conf.avail/70-yes-bitmaps.conf

so ersetzen Sie den .. durch den tatsächlichen vollständigen Pfad des übergeordneten Verzeichnisses der symbolischen Verknüpfung oder der Softlink-Datei.

53
duhhunjonn
os.path.realpath(path)

os.path.realpath gibt den kanonischen Pfad des angegebenen Dateinamens zurück und beseitigt alle symbolischen Links im Pfad.

95
unutbu

Wie unutbu sagt, sollte os.path.realpath(path) die richtige Antwort sein, den kanonischen Pfad des angegebenen Dateinamens zurückgeben und alle symbolischen Links zu ihren Zielen auflösen. Aber es ist unter Windows kaputt.

Ich habe einen Patch für Python 3.2 erstellt, um diesen Fehler zu beheben, und habe ihn hochgeladen unter:

http://bugs.python.org/issue9949

Es behebt die Funktion realpath() in Python32\Lib\ntpath.py.

Ich habe es auch auf meinen Server gestellt, hier:

http://www.burtonsys.com/ntpath_fix_issue9949.Zip

Leider ist der Fehler auch in Python 2.x vorhanden und ich kenne dort keine Korrektur.

13
Dave Burton

http://docs.python.org/library/os.path.html#os.path.abspath

auch joinpath und normpath, abhängig davon, ob Sie sich im aktuellen Arbeitsverzeichnis befinden oder mit anderen Dingen arbeiten. normpath könnte für Sie direkter sein.

Aktualisieren:

speziell:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)
8
eruciform

Die Dokumentation sagt, os.path.join() zu verwenden:

Das Ergebnis kann entweder ein absoluter oder ein relativer Pfadname sein. Wenn es relativ ist, kann es mit os.path.join(os.path.dirname(path), result) in einen absoluten Pfadnamen umgewandelt werden.

0
Don Kirkby

In Windows 10, Python 3.5, os.readlink("C:\\Users\PP"), wo "C:\Users\PP" ein symbolischer Link (kein Junction-Link) ist.

Es gibt den absoluten Pfad zum Verzeichnis zurück.

Dies funktioniert auch auf Ubuntu 16.04, Python 3.5.

0
alpha_989

Ich empfehle die Verwendung von pathlib library für Dateisystemvorgänge.

import pathlib

x = pathlib.Path('lol/lol/path)
x.resolve()

Documentation für Path.resolve(strict=False): Den Pfad absolut machen und alle Symlinks auflösen. Ein neues Pfadobjekt wird zurückgegeben.

0
Alex