Ответ 1
os.path.realpath(path)
os.path.realpath возвращает канонический путь указанного имени файла, исключая любые символические ссылки, встречающиеся в пути.
когда я даю 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
как заменить ..
на фактический полный путь родительского каталога символической ссылки или файла софт-ссылки.
os.path.realpath(path)
os.path.realpath возвращает канонический путь указанного имени файла, исключая любые символические ссылки, встречающиеся в пути.
Как говорит 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, и я не знаю, как это исправить.
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')
)
)
В документации используется os.path.join()
:
Результат может быть либо абсолютным, либо относительным путем; если он относительный, он может быть преобразован в абсолютный путь с помощью
os.path.join(os.path.dirname(path), result)
.
В windows 10, python 3.5, работает os.readlink("C:\\Users\PP")
где "C:\Users\PP" - это символическая ссылка (не ссылка на соединение).
Возвращает абсолютный путь к каталогу.
Это работает и в Ubuntu 16.04, python 3.5.
Я рекомендую использовать библиотеку pathlib
для операций с файловой системой.
import pathlib
x = pathlib.Path('lol/lol/path')
x.resolve()
Документация для Path.resolve(strict=False)
: сделать путь абсолютным, разрешив любые символические ссылки. Новый объект пути возвращается.