Как найти полный (абсолютный путь) целевого файла символической ссылки или мягкой ссылки в Python - PullRequest
56 голосов
/ 11 июля 2010

когда я даю 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

так что для символической ссылки или мягкой ссылки, как найти полный (абсолютный путь) целевого файла в python,

Если я использую

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

выводит

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

но мне нужен абсолютный путь, а не относительный путь, поэтому мой желаемый результат должен быть,

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

как заменить .. фактическим полным путем к родительскому каталогу символической ссылки или файла программной ссылки.

Ответы [ 6 ]

101 голосов
/ 11 июля 2010
os.path.realpath(path)

os.path.realpath возвращает канонический путь указанного имени файла, исключая любые символические ссылки, встречающиеся в пути.

14 голосов
/ 10 марта 2012

Как говорит unutbu, os.path.realpath(path) должен быть правильным ответом, возвращая канонический путь указанного имени файла, разрешая любые символические ссылки на их цели. Но он сломан под Windows.

Я создал патч для Python 3.2, чтобы исправить эту ошибку, и загрузил его на:

http://bugs.python.org/issue9949

Исправляет функцию realpath() в Python32\Lib\ntpath.py

Я также разместил его на своем сервере, здесь:

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

К сожалению, эта ошибка присутствует и в Python 2.x, и я не знаю, как это исправить.

8 голосов
/ 11 июля 2010

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

также joinpath и normpath, в зависимости от того, находитесь ли вы в текущем рабочем каталоге или работаете с другими вещами. normpath может быть более прямым для вас.

Обновление:

конкретно:

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') 
  ) 
)
0 голосов
/ 21 февраля 2019

Я рекомендую использовать библиотеку pathlib для операций с файловой системой.

import pathlib

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

Документация для Path.resolve(strict=False): сделать путь абсолютным, разрешая любые символические ссылки,Новый объект пути возвращается.

0 голосов
/ 31 марта 2018

В windows 10, python 3.5, os.readlink("C:\\Users\PP"), где "C: \ Users \ PP" - символическая ссылка (не ссылка на соединение).

Возвращает абсолютный путь к каталогу.

Это работает и в Ubuntu 16.04, python 3.5.

0 голосов
/ 10 ноября 2017

Документация говорит об использовании os.path.join():

Результатом может быть как абсолютный, так и относительный путь; если он относительный, он может быть преобразован в абсолютный путь, используя os.path.join(os.path.dirname(path), result).

...