149 votes

Pourquoi aurait-on utiliser à la fois, os.chemin d'accès.abspath et les os.chemin d'accès.realpath?

Dans plusieurs projets open source, j'ai vu des gens os.path.abspath(os.path.realpath(__file__)) pour obtenir le chemin absolu vers le fichier en cours.

Cependant, je trouve que os.path.abspath(__file__) et os.path.realpath(__file__) produisent le même résultat. os.path.abspath(os.path.realpath(__file__)) semble être un peu redondant.

Est-il une raison pour laquelle les gens sont à l'aide de qui?

177voto

jobrad Points 761

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'

87voto

kdopen Points 123

os.path.realpath derefences des liens symboliques sur ces systèmes d'exploitation sur lesquels ils s'appuient.

os.path.abspath supprime simplement les choses comme . et .. à partir du chemin d'accès donnant un chemin d'accès complet à partir de la racine de l'arborescence du répertoire pour le nom de fichier (ou faire un 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 intérieur à l' realpath peut retourner un chemin avec embedded .. pièces, qui abspath puis supprime.

12voto

Uday S Points 496

En d'autres termes, si vous essayez d'obtenir le chemin d'accès d'un fichier de raccourci, chemin d'accès absolu donne le chemin complet du fichier présent dans l' emplacement du raccourci, tandis que la fonction realpath donne l' emplacement d'origine, le chemin du fichier.

Chemin d'accès absolu, os.chemin d'accès.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é.

Chemin réel, os.chemin d'accès.la fonction realpath(), donne le chemin complet du fichier qui est visée.

Par exemple:

file = "shortcut_folder/filename"
os.path.abspath(file) = "C:/Desktop/shortcut_folder/filename"
os.path.realpath(file) = "D:/PyCharmProjects/Python1stClass/filename"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X