Pour votre scénario, il n'y a pas de raison de combiner la fonction realpath et abspath, depuis os.path.realpath
fait des appels os.path.abspath
avant de retourner un résultat (j'ai vérifié Python 2.5 de Python 3.6).
-
os.path.abspath
renvoie le chemin absolu, mais ne résout PAS les liens symboliques.
-
os.path.realpath
sera d'abord résoudre les liens symboliques dans le chemin d'accès, puis retourne le chemin d'accès absolu.
Toutefois, si vous attendez de votre chemin pour contenir un ~
, ni abspath ou realpath résoudre ~
pour le répertoire home de l'utilisateur, et le chemin ne sera pas valide. Vous aurez besoin d'utiliser os.path.expanduser
pour résoudre ce pour le répertoire de l'utilisateur.
Pour l'amour d'une explication approfondie, voici quelques résultats que j'ai vérifié sous Windows et Linux, Python 3.4 et Python 2.6. Le répertoire courant (./
) est mon répertoire home, qui ressemble à ceci:
myhome
|- data (symlink to /mnt/data)
|- subdir (extra directory, for verbose explanation)
# os.path.abspath returns the absolute path, but does NOT resolve symlinks
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'