2016-01-04 249 views
0

在Windows上運行於Python 2.7.10上。python isabs無法將Windows 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"也可以使用。你不能在那裏再輸入一個換行符,但是你的路徑名中沒有它們。

因此,您鍵入的路徑名稱可能不是您認爲的那樣。 \是一個特殊的字符,不幸的是微軟在DOS時代認爲這將是一個很好的角色,用作路徑分隔符。 Unix操作系統(其中大多數編程語言和使用\escape character的約定始發)使用正斜槓/,這是沒有問題的。

0

os.path.isabs如果在\\server\share部件後面存在某些路徑信息(即使只是一個斜槓),它將只返回一個UNC路徑的True

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,Windows實現的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