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.
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.
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.
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')
)
)
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)
.
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.
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é.