Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get symlink target in Python?

Tags:

python

symlink

Using Python, I need to check whether hundreds of symlinks are correct and recreate them when not. What I do now is to compare real paths of what I want and what I have, but it's slow because it's over NFS with an automount.

Otherwise I'm going to run a subprocess with the command 'ls -l' and work on the list of strings returned. I would prefer a better solution, using a Python library...

Edit1: I have: link_name -> link_target and then link_target -> a_real_file. What I need is to extract link_target from link_name, not a_real_file. I don't care if the real file does not exist.

Edit2: Maybe I did not express correctly. What I mean by a correct symlink is 'a link that point to a predefined path, even if it does not exist'. So I need to check that:

link_name_1 -> target_1 link_name_2 -> target_2 

That's why I need to extract targets, not the real paths. Then I compare them to a reference (dictionary). So my question is: How do I extract the target path?

like image 569
zorggy Avatar asked Oct 20 '15 09:10

zorggy


People also ask

How do I find a symbolic link in Python?

islink() method in Python is used to check whether the given path represents an existing directory entry that is a symbolic link or not. Note: If symbolic links are not supported by the Python runtime then os. path. islink() method always returns False.

How do I create a symbolic link in target?

To create a symbolic link in Linux, we use the ln command. Executing the command with no options creates a hard link to the specified target file.

What is symlink target?

In computing, a symbolic link (also symlink or soft link) is a file whose purpose is to point to a file or directory (called the "target") by specifying a path thereto. Symbolic links are supported by POSIX and by most Unix-like operating systems, such as FreeBSD, Linux, and macOS.


Video Answer


1 Answers

The problem with os.readlink() is it will only resolve 1 step of the link. We can have a situation where A links to another link B, and B link is dangling.

$ ln -s /tmp/example/notexist /tmp/example/B $ ln -s /tmp/example/B /tmp/example/A $ ls -l /tmp/example A -> /tmp/example/B B -> /tmp/example/notexist 

Now in Python, os.readlink gives you the first target.

>>> import os >>> os.readlink('A') '/tmp/example/B' 

But in most situations I assume we are interested in the resolved path. So pathlib can help here:

>>> from pathlib import Path >>> Path('A').resolve() PosixPath('/tmp/example/notexist') 

For older Python versions:

>>> os.path.realpath('A') '/tmp/example/notexist' 
like image 101
wim Avatar answered Sep 23 '22 13:09

wim