Pour votre scénario déclaré, il n'y a aucune raison de combiner realpath et abspath, car il os.path.realpathappelle en fait os.path.abspathavant de renvoyer un résultat (j'ai vérifié Python 2.5 vers Python 3.6).
os.path.abspath renvoie le chemin absolu, mais ne résout PAS les liens symboliques dans son argument.
os.path.realpath résoudra d'abord tous les liens symboliques dans le chemin, puis retournera le chemin absolu.
Cependant, si vous prévoyez que votre chemin contient un ~, ni abspath ni realpath ne seront résolus ~dans le répertoire de base de l'utilisateur et le chemin qui en résulte sera invalide . Vous devrez utiliser os.path.expanduserpour résoudre ce problème dans le répertoire de l'utilisateur.
Pour une explication approfondie, voici quelques résultats que j'ai vérifiés sous Windows et Linux, en Python 3.4 et Python 2.6. Le répertoire courant ( ./) est mon répertoire personnel, 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 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()peut contenir des..composants et ne répond pas vraiment à la question de savoir pourquoi vous utiliseriez les deux; La réponse de jobrad est plus précise.