mirror of
https://github.com/python/cpython.git
synced 2025-08-28 04:35:02 +00:00
SF patch #461781 by Chris Lawrence: os.path.realpath - Resolve symlinks:
Once upon a time, I put together a little function that tries to find the canonical filename for a given pathname on POSIX. I've finally gotten around to turning it into a proper patch with documentation. On non-POSIX, I made it an alias for 'abspath', as that's the behavior on POSIX when no symlinks are encountered in the path. Example: >>> os.path.realpath('/usr/bin/X11/X') '/usr/X11R6/bin/X'
This commit is contained in:
parent
3065c94f37
commit
83eeef4b06
6 changed files with 41 additions and 0 deletions
|
@ -379,3 +379,24 @@ def abspath(path):
|
|||
if not isabs(path):
|
||||
path = join(os.getcwd(), path)
|
||||
return normpath(path)
|
||||
|
||||
|
||||
# Return a canonical path (i.e. the absolute location of a file on the
|
||||
# filesystem).
|
||||
|
||||
def realpath(filename):
|
||||
"""Return the canonical path of the specified filename, eliminating any
|
||||
symbolic links encountered in the path."""
|
||||
filename = abspath(filename)
|
||||
|
||||
bits = ['/'] + filename.split('/')[1:]
|
||||
for i in range(2, len(bits)+1):
|
||||
component = join(*bits[0:i])
|
||||
if islink(component):
|
||||
resolved = os.readlink(component)
|
||||
(dir, file) = split(component)
|
||||
resolved = normpath(join(dir, resolved))
|
||||
newpath = join(*([resolved] + bits[i:]))
|
||||
return realpath(newpath)
|
||||
|
||||
return filename
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue