Нет, это в настоящее время не представляется возможным, чтобы получить результаты от pathlib
что os.readlink()
дает. Path.resolve()
не работает для неработающих ссылок и либо поднимает FileNotFoundError
(Python < 3.5), либо возвращает потенциально странный путь (Python 3.6). По-прежнему можно получить старое поведение с Path.resolve(True)
, хотя это означает несовместимость между версиями (кстати, в документации по пакетам и в разделе «Портирование документа выпуска Py3.6»).
Также относительно обновленного вопроса об абсолютных путях, несмотря на принятый ответ, os.readlink()
- единственный способ проверить, является ли символическая ссылка абсолютной или относительной. Path.relative_to()
как имя говорит, преобразует существующий путь в относительный, не проверяя, начинается ли путь назначения символической ссылки с '/' или нет. То же самое относится к Path.is_absolute()
. Наконец Path.resolve()
для существующих целей, преобразует путь назначения, чтобы он уничтожал необходимую информацию на этом пути.
И странном пути выше, я имею в виду, скажем, в /home/test
есть символическая .myapp
указывая на .config/myapp/config
. Если .config/myapp
не существует, а код написан в Py < = 3.5, Path.resolve()
может вызвать исключение, и приложение может сообщить пользователю о пропавшем файле. Теперь, если он вызван из Py3.6 без изменений кода, он разрешает ~/.config/myapp
, исключение не выбрасывается, поэтому отметьте около .resolve()
проходов, но затем, вероятно, другое исключение будет отправлено позже, когда приложение попытается открыть файл для чтения, поэтому пользователь может получить сообщение, что файл ~/config/myapp
не найден, хотя на самом деле этого не хватает. Это может быть еще хуже - когда приложение будет делать Path('/home/test/.myapp').resolve().open('w')
(не обязательно в один шаг, но скажем, как часть некоторого процесса санитарной обработки), то создается просто неправильный файл. Конечно, в следующий раз, когда приложение вызывается, путь разрешает один уровень глубже, до /home/test/.config/myapp/config
(поскольку Path.resolve()
не проверяет, является ли myapp
- это каталог или нет), и чтение и запись с ошибкой NotADirectoryError
(с небольшим количеством вводимых в заблуждение "Not a directory: /home/test/.config/myapp/config"
как описание ...).
Это почти то, что я хочу, проблема в том, что 'resolve' делает путь абсолютным, пока я не хочу поведения. Следующий шаг - отфильтровать все символические ссылки, которые не являются абсурдом –