Seite 1 von 1

symbolischen Link auslesen

Verfasst: Samstag 30. August 2014, 21:51
von Holger Chapman
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

Re: symbolischen Link auslesen

Verfasst: Samstag 30. August 2014, 22:01
von cofi
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'

Re: symbolischen Link auslesen

Verfasst: Samstag 30. August 2014, 23:39
von Holger Chapman
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

Re: symbolischen Link auslesen

Verfasst: Samstag 30. August 2014, 23:51
von 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'

Re: symbolischen Link auslesen

Verfasst: Sonntag 31. August 2014, 01:10
von Holger Chapman
BlackJack hat geschrieben:Das könntest Du mit ``linktarget = os.readlink`` erreichen.
Das scheint genau das zu sein, was ich gesucht habe. Danke!


Holger