2016-01-04 2 views
0

Работает на Python 2.7.10 на окнах.python isabs не распознает путь UNC UNC как абсолютный путь

> os.path.isabs(r"\\\unc_path\file") 
False 

> os.path.isabs(r"\\\unc_path\") 
False 

Это по дизайну?

+2

Укажите буквальное имя пути вы проверяете. Пути, которые вы указали, не являются путями UNC, поскольку они не имеют двойной обратный слэш. –

+0

Вам не понадобится устройство, чтобы сделать это абсолютным? 'os.path.isabs (r" c: \ unc_path \ file ")' или os.path.isabs (r "\\ unc_path \ file") – Vatine

+0

Также см. примечание [здесь] (https: // docs. python.org/2/library/os.path.html#module-os.path): «* Примечание. В Windows многие из этих функций неправильно поддерживают UNC-пути. *« –

ответ

0

Вам необходимо обратить внимание на стрижки, которые обычно выполняются при помощи \.

Например, \n является символом новой строки. \\ дает одиночный слэш \.

Таким образом, строка "\\something" будет напечатана как \something.

Если вы хотите, чтобы иметь содержания\\something нужно ввести \\\\something, то есть двойная любая обратный косая черта. В качестве альтернативы вы можете использовать необработанные строки: r"\\something" также будет работать. Вы больше не можете вводить новую строку, но у вас их нет в именах путей.

Значит, имена путей, которые вы набрали, могут быть не такими, какими вы думаете. \ - особый символ, и, к сожалению, Microsoft во времена DOS считала, что это хороший символ, который будет использоваться в качестве разделителя путей. Операционные системы Unix (в которых большинство языков программирования и соглашение об использовании возникают) используют косую черту /, что является беспроблемным.

0

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 
Смежные вопросы