symbolischen Link auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Holger Chapman
User
Beiträge: 35
Registriert: Samstag 12. Juli 2014, 01:59

Hallo!

Ich möchte in Python 2 den Inhalt eines symbolischen Links ("soft link") auslesen.

Zum Beispiel (unter Linux):

Code: Alles auswählen

$ pwd
/home/holger/test

$ ls -l
total 0
lrwxrwxrwx 1 holger holger 7 Aug 30 22:46 link -> ../file
In diesem Fall möchte ich nicht "/home/holger/file" als Ergebnis bekommen (das würde mir "os.path.realpath('/home/holger/test/link')" liefern), sondern "../file", so wie es mir der "ls"-Befehl ausgibt.

Wie kann ich das erreichen?

Vielen Dank!


Holger
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, du moechtest einen absoluten Pfad zu einem relativen machen. Dafuer gibt es `os.path.relpath`:

Code: Alles auswählen

In [6]: !ln -s ../file link

In [7]: import os

In [8]: os.path.realpath('link')
Out[8]: '/home/file'

In [9]: os.path.relpath(os.path.realpath('link'))
Out[9]: '../file'
Holger Chapman
User
Beiträge: 35
Registriert: Samstag 12. Juli 2014, 01:59

cofi hat geschrieben:Nein, du moechtest einen absoluten Pfad zu einem relativen machen.
Nein, das möchte ich nicht.

Ich möchte einen absoluten Pfad erhalten, wenn der Symlink absolut auf eine Datei verweist, und ich möchte einen relativen Pfad erhalten, wenn der Symlink relativ auf eine Datei verweist.

Situation:

Code: Alles auswählen

$ pwd
/home/holger/test

$ ls -l
insgesamt 0
lrwxrwxrwx 1 holger holger  7 Aug 31 00:27 link1 -> ../file
lrwxrwxrwx 1 holger holger 17 Aug 31 00:27 link2 -> /home/holger/file
Ich brauche Folgendes:

Code: Alles auswählen

>>> print linktarget('/home/holger/test/link1')
../file

>>> print linktarget('/home/holger/test/link2')
/home/holger/file
Wie kann ich das erreichen?

Danke


Holger
BlackJack

@Holger Chapman: Das könntest Du mit ``linktarget = os.readlink`` erreichen. ;-)

Code: Alles auswählen

In [70]: !ln -s ../file link

In [71]: !ln -s /home/file link2

In [72]: !ls -l link*
lrwxrwxrwx 1 bj bj  7 Aug 31 00:48 link -> ../file
lrwxrwxrwx 1 bj bj 10 Aug 31 00:48 link2 -> /home/file

In [73]: os.readlink('link')
Out[73]: '../file'

In [74]: os.readlink('link2')
Out[74]: '/home/file'
Holger Chapman
User
Beiträge: 35
Registriert: Samstag 12. Juli 2014, 01:59

BlackJack hat geschrieben:Das könntest Du mit ``linktarget = os.readlink`` erreichen.
Das scheint genau das zu sein, was ich gesucht habe. Danke!


Holger
Antworten