os.path.realpath elimina los enlaces simbólicos en los sistemas operativos que los soportan.
os.path.abspathsimplemente elimina cosas como .y ..de la ruta dando una ruta completa desde la raíz del árbol de directorios hasta el archivo nombrado (o enlace simbólico)
Por ejemplo, en Ubuntu
$ ls -l
total 0
-rw-rw-r-- 1 guest guest 0 Jun 16 08:36 a
lrwxrwxrwx 1 guest guest 1 Jun 16 08:36 b -> a
$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from os.path import abspath, realpath
>>> abspath('b')
'/home/guest/play/paths/b'
>>> realpath('b')
'/home/guest/play/paths/a'
Los enlaces simbólicos pueden contener rutas relativas, de ahí la necesidad de utilizar ambos. La llamada interna a realpathpodría devolver una ruta con ..partes incrustadas , que abspathluego elimina.
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.abspathtodavía sigo enlaces simbólicos si el directorio actual es un enlace simbólico. Solo encontré esta respuesta stackoverflow.com/questions/54665065/… para detener este comportamiento.Para su escenario establecido, no hay razón para combinar realpath y abspath, ya que en
os.path.realpathrealidad las llamadasos.path.abspathantes de devolver un resultado (verifiqué Python 2.5 a Python 3.6).os.path.abspathdevuelve la ruta absoluta, pero NO resuelve los enlaces simbólicos en su argumento.os.path.realpathPrimero 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á usaros.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í:fuente
os.path.realpath(os.path.expanduser('~/subdir/../data'))En términos simples, si está tratando de obtener la ruta de un archivo de acceso directo, la ruta absoluta proporciona la ruta completa del archivo presente en la ubicación del acceso directo , mientras que realpath proporciona la ruta de ubicación original del archivo.
La ruta absoluta, os.path.abspath (), proporciona la ruta completa del archivo que se encuentra en el directorio de trabajo actual o en el directorio que mencionó.
Ruta real, os.path.realpath (), proporciona la ruta completa del archivo al que se hace referencia.
P.ej:
fuente