os.path.realpath() on POSIX

Chris Lawrence quango at watervalley.net
Mon Jun 7 02:58:15 EDT 1999


This patch implements a realpath() function (cfr GNU libc) that gives
the canonical location of a file on the filesystem, resolving any
symlinks in the middle.

For example, /usr/bin/X11/xterm is often actually
/usr/X11R6/bin/xterm, even though xterm itself is not a symbolic link
(the link is usually /usr/bin/X11 -> /usr/X11R6/bin or ../../X11R6/bin).

This sort of thing is useful when you're trying to track down what
package includes a certain file, etc.

This patch also gives abspath() a docstring.

[os.path.realpath() should probably act like os.path.abspath() on most
non-POSIX systems.]

--- /usr/lib/python1.5/posixpath.py	Fri May 21 10:26:23 1999
+++ posixpath.py	Mon Jun  7 01:48:16 1999
@@ -371,6 +371,28 @@
 
 # Return an absolute path.
 def abspath(path):
+    """Return an absolute path.  If the path does not start with a /, assume
+it is relative to os.getcwd()."""
     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."""
+    import string
+    filename = abspath(filename)
+
+    bits = ['/'] + string.split(filename, '/')[1:]
+    for i in range(2, len(bits)+1):
+        component = apply(join, bits[0:i])
+        if islink(component):
+            resolved = os.readlink(component)
+            (dir, file) = split(component)
+            resolved = normpath(join(dir, resolved))
+            newpath = apply(join, [resolved] + bits[i:])
+            return realpath(newpath)
+
+    return filename


Chris
-- 
=============================================================================
|          Chris Lawrence         |       Get your Debian 2.1 CD-ROMs       |
|     <quango at watervalley.net>    |        http://www.lordsutch.com/        |
|                                 |                                         |
|     Grad Student, Pol. Sci.     |     Do you want your bank to snoop?     |
|    University of Mississippi    |    http://www.defendyourprivacy.com/    |
=============================================================================




More information about the Python-list mailing list