os.readlink returning value

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Fri Nov 2 00:30:15 EDT 2007


En Thu, 01 Nov 2007 22:51:14 -0300, Giampaolo Rodola' <gnewsg at gmail.com>  
escribió:

> 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)

-- 
Gabriel Genellina




More information about the Python-list mailing list