os.path.realpath
déréfère les liens symboliques sur les systèmes d'exploitation qui les prennent en charge.
os.path.abspath
supprime simplement des choses comme .
et ..
du chemin en donnant un chemin complet de la racine de l'arborescence de répertoires au fichier nommé (ou lien symbolique)
Par exemple, sur 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'
Les liens symboliques peuvent contenir des chemins relatifs, d'où la nécessité d'utiliser les deux. L'appel interne à realpath
peut renvoyer un chemin avec des ..
parties incorporées , qui abspath
supprime ensuite.
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.abspath
toujours suivi des liens symboliques si le répertoire courant est un lien symbolique. J'ai seulement trouvé cette réponse stackoverflow.com/questions/54665065/… pour arrêter ce comportement.Pour votre scénario déclaré, il n'y a aucune raison de combiner realpath et abspath, car il
os.path.realpath
appelle en faitos.path.abspath
avant 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 utiliseros.path.expanduser
pour 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:la source
os.path.realpath(os.path.expanduser('~/subdir/../data'))
En termes simples, si vous essayez d'obtenir le chemin d'un fichier de raccourci, le chemin absolu donne le chemin complet du fichier présent dans l' emplacement du raccourci , tandis que realpath donne le chemin de l' emplacement d'origine du fichier.
Chemin absolu, os.path.abspath (), donne le chemin complet du fichier qui se trouve dans le répertoire de travail actuel ou le répertoire que vous avez mentionné.
Le chemin réel, os.path.realpath (), donne le chemin complet du fichier référencé.
Par exemple:
la source