summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-09-17 15:16:09 (GMT)
committerGuido van Rossum <guido@python.org>2001-09-17 15:16:09 (GMT)
commit83eeef4b067b7182778581c9fdfb104492647bd4 (patch)
treec2edf75165c4ae1d928954315ee4fb83545fa9f7 /Lib
parent3065c94f373ed32922374a04923f21d41ca0a726 (diff)
downloadcpython-83eeef4b067b7182778581c9fdfb104492647bd4.zip
cpython-83eeef4b067b7182778581c9fdfb104492647bd4.tar.gz
cpython-83eeef4b067b7182778581c9fdfb104492647bd4.tar.bz2
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'
Diffstat (limited to 'Lib')
-rw-r--r--Lib/dospath.py3
-rw-r--r--Lib/macpath.py3
-rw-r--r--Lib/ntpath.py3
-rw-r--r--Lib/plat-riscos/riscospath.py4
-rw-r--r--Lib/posixpath.py21
5 files changed, 34 insertions, 0 deletions
diff --git a/Lib/dospath.py b/Lib/dospath.py
index 958f9f6..5f60705 100644
--- a/Lib/dospath.py
+++ b/Lib/dospath.py
@@ -330,3 +330,6 @@ def abspath(path):
if not isabs(path):
path = join(os.getcwd(), path)
return normpath(path)
+
+# realpath is a no-op on systems without islink support
+realpath = abspath
diff --git a/Lib/macpath.py b/Lib/macpath.py
index 46ae764..1ef35ef 100644
--- a/Lib/macpath.py
+++ b/Lib/macpath.py
@@ -225,3 +225,6 @@ def abspath(path):
if not isabs(path):
path = join(os.getcwd(), path)
return normpath(path)
+
+# realpath is a no-op on systems without islink support
+realpath = abspath
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index d55cc7c..a1baf83 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -451,3 +451,6 @@ def abspath(path):
else:
path = os.getcwd()
return normpath(path)
+
+# realpath is a no-op on systems without islink support
+realpath = abspath
diff --git a/Lib/plat-riscos/riscospath.py b/Lib/plat-riscos/riscospath.py
index 32f39ba..8eda834 100644
--- a/Lib/plat-riscos/riscospath.py
+++ b/Lib/plat-riscos/riscospath.py
@@ -315,6 +315,10 @@ def abspath(p):
return normpath(join(os.getcwd(), p))
+# realpath is a no-op on systems without islink support
+realpath = abspath
+
+
# Normalize a path. Only special path element under RISC OS is "^" for "..".
def normpath(p):
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 6bf40f8..0f6b6a7 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -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