For your stated scenario, there is no reason to combine realpath and abspath, since os.path.realpath
actually calls os.path.abspath
before returning a result (I checked Python 2.5 to Python 3.6).
os.path.abspath
returns the absolute path, but does NOT resolve symlinks in its argument.
os.path.realpath
will first resolve any symbolic links in the path, and then return the absolute path.
However, if you expect your path to contain a ~
, neither abspath or realpath will resolve ~
to the user's home directory, and the resulting path will be invalid. You will need to use os.path.expanduser
to resolve this to the user's directory.
For the sake of a thorough explanation, here are some results which I've verified in Windows and Linux, in Python 3.4 and Python 2.6. The current directory (./
) is my home directory, which looks like this:
myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks in its argument
os.path.abspath('./')
'/home/myhome'
os.path.abspath('./subdir/../data')
'/home/myhome/data'
# os.path.realpath will resolve symlinks AND return an absolute path from a relative path
os.path.realpath('./')
'/home/myhome'
os.path.realpath('./subdir/../')
'/home/myhome'
os.path.realpath('./subdir/../data')
'/mnt/data'
# NEITHER abspath or realpath will resolve or remove ~.
os.path.abspath('~/data')
'/home/myhome/~/data'
os.path.realpath('~/data')
'/home/myhome/~/data'
# And the returned path will be invalid
os.path.exists(os.path.abspath('~/data'))
False
os.path.exists(os.path.realpath('~/data'))
False
# Use realpath + expanduser to resolve ~
os.path.realpath(os.path.expanduser('~/subdir/../data'))
'/mnt/data'
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…