Как найти целевой файл полный (абсолютный путь) символической ссылки или soft link в python

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

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

Ответ 1

os.path.realpath(path)

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

Ответ 2

Как говорит 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, и я не знаю, как это исправить.

Ответ 3

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

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

Update:

а именно:

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

Ответ 4

В документации используется os.path.join():

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

Ответ 5

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

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

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

Ответ 6

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

import pathlib

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

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