Работает на Python 2.7.10 на окнах.python isabs не распознает путь UNC UNC как абсолютный путь
> os.path.isabs(r"\\\unc_path\file")
False
> os.path.isabs(r"\\\unc_path\")
False
Это по дизайну?
Работает на Python 2.7.10 на окнах.python isabs не распознает путь UNC UNC как абсолютный путь
> os.path.isabs(r"\\\unc_path\file")
False
> os.path.isabs(r"\\\unc_path\")
False
Это по дизайну?
Вам необходимо обратить внимание на стрижки, которые обычно выполняются при помощи \
.
Например, \n
является символом новой строки. \\
дает одиночный слэш \
.
Таким образом, строка "\\something"
будет напечатана как \something
.
Если вы хотите, чтобы иметь содержания\\something
нужно ввести \\\\something
, то есть двойная любая обратный косая черта. В качестве альтернативы вы можете использовать необработанные строки: r"\\something"
также будет работать. Вы больше не можете вводить новую строку, но у вас их нет в именах путей.
Значит, имена путей, которые вы набрали, могут быть не такими, какими вы думаете. \
- особый символ, и, к сожалению, Microsoft во времена DOS считала, что это хороший символ, который будет использоваться в качестве разделителя путей. Операционные системы Unix (в которых большинство языков программирования и соглашение об использовании возникают) используют косую черту /
, что является беспроблемным.
os.path.isabs
будет возвращать True
для UNC-пути, если имеется некоторая информация о пути (хотя бы одна косая черта) после части \\server\share
.
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
False
>>> os.path.isabs('\\\\server\\share\\')
True
Чтобы понять, почему это полезно, чтобы понять, что isabs
лишь малая часть кода на вершине splitdrive
. В ntpath
, реализация Окна os.path
, это выглядит следующим образом:
def isabs(s):
"""Test whether a path is absolute"""
s = splitdrive(s)[1]
return s != '' and s[:1] in '/\\'
splitdrive
реализация предназначена для обработки как пути с буквой диска, а также путями UNC и иметь некоторую согласованность между ними. Документация для ntpath.splitdrive
говорит:
Если путь содержит букву диска, drive_or_unc будет содержать все вплоть до и включая двоеточие. например splitdrive («C:/реж») возвращается («C:», «/ реж»)
Если путь содержит путь UNC, то drive_or_unc будет содержать имя хоста и долю до, но не включая четвертый каталог разделительный символ. например splitdrive ("// хост/компьютер/реж") возвращает ("// хост/компьютера", "/ реж")
Итак ...
>>> os.path.splitdrive('\\\\server\\share')
('\\\\server\\share', '')
Вы можете видеть, что isabs
вернется False
.
Это, как говорится, это поведение изменилось между Python 2.7.7 и Python 2.7.8:
Python 2.7.7 (default, Oct 12 2015, 14:42:48) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
True
>>> os.path.isabs('\\\\server\\share\\')
True
Изменение было зафиксировать в os.path.join
в bug. Я не совсем уверен, что если разработчики Python поняли, что это будет критическим изменением для некоторых os.path
функций, а поведение согласуется с Python 3.5:
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.isabs('\\\\server\\share')
False
>>> os.path.isabs('\\\\server\\share\\')
True
Укажите буквальное имя пути вы проверяете. Пути, которые вы указали, не являются путями UNC, поскольку они не имеют двойной обратный слэш. –
Вам не понадобится устройство, чтобы сделать это абсолютным? 'os.path.isabs (r" c: \ unc_path \ file ")' или os.path.isabs (r "\\ unc_path \ file") – Vatine
Также см. примечание [здесь] (https: // docs. python.org/2/library/os.path.html#module-os.path): «* Примечание. В Windows многие из этих функций неправильно поддерживают UNC-пути. *« –