Para su escenario establecido, no hay razón para combinar realpath y abspath, ya que en os.path.realpathrealidad las llamadas os.path.abspathantes de devolver un resultado (verifiqué Python 2.5 a Python 3.6).
os.path.abspath devuelve la ruta absoluta, pero NO resuelve los enlaces simbólicos en su argumento.
os.path.realpath Primero resolverá cualquier enlace simbólico en la ruta y luego devolverá la ruta absoluta.
Sin embargo, si espera que su ruta contenga un ~, ni abspath ni realpath se resolverán ~en el directorio de inicio del usuario y la ruta resultante no será válida . Necesitará usar os.path.expanduserpara resolver esto en el directorio del usuario.
En aras de una explicación detallada, aquí hay algunos resultados que he verificado en Windows y Linux, en Python 3.4 y Python 2.6. El directorio actual ( ./) es mi directorio de inicio, que se ve así:
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'
realpath()pueda contener..componentes y realmente no responde a la pregunta de por qué usaría ambas; La respuesta de jobrad es más precisa.