os.readlink returning value

  • Thread starter Giampaolo Rodola'
  • Start date
G

Giampaolo Rodola'

I was reading os.readlink doc which says:

readlink( path)

Return a string representing the path to which the symbolic link
points. The result may be either an absolute or relative pathname; if
it is relative, it may be converted to an absolute pathname using
os.path.join(os.path.dirname(path), result). Availability: Macintosh,
Unix.



....It's not clear to me when the returning result could be absolute
and when it could be relative.
Could someone clarify this point?
 
G

Gabriel Genellina

I was reading os.readlink doc which says:

readlink( path)

Return a string representing the path to which the symbolic link
points. The result may be either an absolute or relative pathname; if
it is relative, it may be converted to an absolute pathname using
os.path.join(os.path.dirname(path), result). Availability: Macintosh,
Unix.



...It's not clear to me when the returning result could be absolute
and when it could be relative.
Could someone clarify this point?

That depends on how the symlink was created. Assume the current directory
is /usr/home/giampaolo/any/dir
ln -s ../foo/bar
creates a symbolic link at /usr/home/giampaolo/any/dir/bar pointing to
.../foo/bar (relative to where the link resides). That is, actually
pointing to /usr/home/giampaolo/any/foo/bar (but this absolute path is NOT
stored on the link itself - only ../foo/bar)

Now, a program whose current directory is /usr/home/giampaolo executes
this:
readlink("any/dir/bar")
It will return the string "../foo/bar". One must resolve the .. reference
relative to where the link resides, NOT relative to the current directory.
That is, relative to any/dir. os.path.dirname("any/dir/bar") returns
exactly that. Then, the suggested expression in the docs evaluates to
"any/dir/../foo/bar" - it's not an absolute pathname yet, one should use
abspath() on it. Or instead
os.path.join(os.path.abspath(os.path.dirname(path)), result)
 
T

Tim Roberts

Giampaolo Rodola' said:
I was reading os.readlink doc which says:

readlink( path)

Return a string representing the path to which the symbolic link
points. The result may be either an absolute or relative pathname; if
it is relative, it may be converted to an absolute pathname using
os.path.join(os.path.dirname(path), result). Availability: Macintosh,
Unix.

...It's not clear to me when the returning result could be absolute
and when it could be relative.
Could someone clarify this point?

It will be relative if the symbolic link is relative, and absolute if the
symbolic link is absolute.

ln -s ../../over/there here1
ln -s /home/timr/spot here2

"here1" is a relative link. "here2" is an absolute link.
 
G

Giampaolo Rodola'

That depends on how the symlink was created. Assume the current directory
is /usr/home/giampaolo/any/dir> ln -s ../foo/bar

creates a symbolic link at /usr/home/giampaolo/any/dir/bar pointing to
../foo/bar (relative to where the link resides). That is, actually
pointing to /usr/home/giampaolo/any/foo/bar (but this absolute path is NOT
stored on the link itself - only ../foo/bar)

Now, a program whose current directory is /usr/home/giampaolo executes
this:
readlink("any/dir/bar")
It will return the string "../foo/bar". One must resolve the .. reference
relative to where the link resides, NOT relative to the current directory..
That is, relative to any/dir. os.path.dirname("any/dir/bar") returns
exactly that. Then, the suggested expression in the docs evaluates to
"any/dir/../foo/bar" - it's not an absolute pathname yet, one should use
abspath() on it. Or instead
os.path.join(os.path.abspath(os.path.dirname(path)), result)

Thanks for the examplanation.
I'd only want to do the same as what ls does in such cases.
Imho, os.readlink() should have the same behaviour of ls, isn't it?
 
G

Gabriel Genellina

I'd only want to do the same as what ls does in such cases.
Imho, os.readlink() should have the same behaviour of ls, isn't it?

Yes; os.readlink shows the same as ls -l
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,431
Messages
2,571,677
Members
48,796
Latest member
Greg L.

Latest Threads

Top