os.path.realpath
elimina los enlaces simbólicos en los sistemas operativos que los soportan.
os.path.abspath
simplemente 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 realpath
podría devolver una ruta con ..
partes incrustadas , que abspath
luego 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.abspath
todaví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.realpath
realidad las llamadasos.path.abspath
antes 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á usaros.path.expanduser
para 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