web-dev-qa-db-fra.com

comment trouver le fichier cible complet (chemin absolu) du lien symbolique ou du lien symbolique en python

quand je donne ls -l /etc/fonts/conf.d/70-yes-bitmaps.conf

lrwxrwxrwx <snip> /etc/fonts/conf.d/70-yes-bitmaps.conf -> ../conf.avail/70-yes-bitmaps.conf

donc, pour un lien symbolique ou un lien symbolique, comment trouver le fichier cible complet (chemin absolu) en python,

Si j'utilise

os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf')

il sort

../conf.avail/70-yes-bitmaps.conf

mais j'ai besoin du chemin absolu, pas du chemin relatif, donc le résultat souhaité doit être,

/etc/fonts/conf.avail/70-yes-bitmaps.conf

comment remplacer le .. par le chemin complet du répertoire parent du lien symbolique ou du fichier de lien symbolique.

53
duhhunjonn
os.path.realpath(path)

os.path.realpath renvoie le chemin canonique du nom de fichier spécifié, en éliminant les liens symboliques rencontrés dans le chemin.

95
unutbu

Comme le dit unutbu, os.path.realpath(path) devrait être la bonne réponse, renvoyant le chemin canonique du nom de fichier spécifié, résolvant les liens symboliques vers leurs cibles. Mais c'est cassé sous Windows.

J'ai créé un correctif pour Python 3.2 afin de corriger ce bogue et je l'ai téléchargé sur:

http://bugs.python.org/issue9949

Il corrige la fonction realpath() dans Python32\Lib\ntpath.py

Je l'ai aussi mis sur mon serveur, ici:

http://www.burtonsys.com/ntpath_fix_issue9949.Zip

Malheureusement, le bogue est présent dans Python 2.x également, et je n'y connais aucune solution.

13
Dave Burton

http://docs.python.org/library/os.path.html#os.path.abspath

aussi joinpath et normpath, selon que vous vous trouviez dans le répertoire de travail actuel ou que vous travailliez avec d'autres choses. normpath pourrait être plus direct pour vous.

Mettre à jour:

plus précisément:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)
8
eruciform

La documentation dit d'utiliser os.path.join():

Le résultat peut être un chemin absolu ou relatif; s'il est relatif, il peut être converti en un chemin absolu à l'aide de os.path.join(os.path.dirname(path), result).

0
Don Kirkby

Sur Windows 10, python 3.5, os.readlink("C:\\Users\PP") où "C:\Users\PP" est un lien symbolique (et non un lien de jonction) fonctionne.

Il renvoie le chemin absolu du répertoire.

Cela fonctionne sur Ubuntu 16.04, Python 3.5 également.

0
alpha_989

Je recommande d'utiliser pathlib library pour les opérations du système de fichiers.

import pathlib

x = pathlib.Path('lol/lol/path)
x.resolve()

Documentation for Path.resolve(strict=False): rend le chemin absolu, résolvant les liens symboliques. Un nouvel objet de chemin est renvoyé.

0
Alex