2009-10-27 60 views
9

Python程序中的所有路徑都可以使用「..」(用於父目錄)和/(用於分隔路徑組件),並且無論平臺是還是可以使用?一方面,我從未在文檔中看到過這樣的聲明(我可能錯過了它),並且os和os.path模塊確實提供了以平臺不可知的方式處理路徑的工具(os.pardir, os.path.join,...),這讓我覺得他們在這裏是有原因的。Unix路徑:在任何平臺上正式使用Python?

在另一方面,你可以read on StackOverflow說:「../path/to/file」適用於所有平臺...

所以,應該os.pardir,os.path.join和朋友經常一起使用,出於可移植性目的,還是Unix路徑名始終安全(最多可能出現字符編碼問題)?或者「幾乎總是」安全(即在Windows,OS X和Linux下工作)?

+4

在windows上從來沒有問題。 – jldupont 2009-10-27 21:03:16

回答

6

「幾乎總是安全」是正確的。您關心的所有平臺今天可能都可以正常工作,我認爲他們不會很快改變慣例。

然而,Python是非常便攜的,運行的平臺比平常多得多。 os模塊的原因是爲了幫助平滑它,而平臺確實有不同的要求。

是否有充分的理由不使用os函數?

os.pardir是自我記錄,而".."不是,os.pardir可能是更容易給grep的

這裏是蟒蛇1.6的一些文檔時,蘋果仍然是一切不同

OS程序對於Mac,DOS,NT或Posix,取決於我們的系統是什麼 。

此輸出: - 來自posix,nt,dos,os2,mac或ce的所有函數,例如,取消鏈接,統計等。 - os.path是posixpath,ntpath,macpath或dospath中的一個模塊 - os.name是'posix','nt','dos','os2','mac',或'ce' - os.curdir是一個表示當前目錄('。'或':')的字符串 - os.pardir是代表父目錄('..'或'::')的字符串 - os.sep是(或最常見的)路徑名分隔符('/'或':'或'\') - os.altsep是備用路徑名分隔符(None或'/') - os.pathsep是組件分隔符用於$ PATH等 - os.linesep是文本文件中的行分隔符(''或''或'') - os.defpath是可執行文件的默認搜索路徑

導入和使用'os'的程序在不同平臺之間移植的機會更大。當然,他們必須只使用由所有平臺定義的功能(例如,unlink和 opendir),並且將所有的路徑名操作保留到os.path(例如,,拆分 並加入)。

+0

我之所以想繞過os.path和co。是不是使用os.path.join(os.pardir,['dir1','dir2','dir3','file)來寫「../dir1/dir2/dir3/file」更簡單也更清楚「])! – EOL 2009-10-27 21:58:27

+0

@EOL我想不出有太多需要的程序。將這樣的路徑移動到配置文件中也許是有道理的。 – 2009-10-27 22:58:23

+0

@gnibbler我的程序可以分析數以千計的數據集,並將結果存儲在傳統位置,其中的目錄名稱是根據每個數據集的「名稱」計算出來的。但是,os.path.join(os.pardir,...)幾乎和直接路徑編碼一樣短。 – EOL 2009-10-28 08:49:41

1

OS/X和Linux都是Unix兼容的,所以根據定義,它們使用您在問題開始時提供的格式。除了「\」之外,Windows還允許「/」,這樣程序就可以與Xenix進行互換,Xenix是Microsoft很久以前試用的一種Unix版本,並且兼容性一直延續到現在。因此它也起作用。

我不知道有多少其他平臺Python已經移植到,我不能爲他們說話。

3

在Python中,使用/將始終有效。如果要在子shell中執行命令,則需要了解操作系統約定。

myprog = "/path/to/my/program" 
os.system([myprog, "-n"])       # 1 
os.system([myprog, "C:/input/file/to/myprog"])  # 2 

命令#1可能會按預期工作。
如果myprog是Windows命令,並且希望解析其命令行參數以獲取Windows文件名,命令#2可能不起作用。

+1

只是一個方面說明 - 不要使用'os.system'來運行程序。它需要一個字符串(不像您使用的列表),並且不必要的調用一個shell。改用'subprocess'模塊。 – nosklo 2009-10-28 10:46:03

3

Windows支持/作爲路徑分隔符。 UNIX文件名和Windows文件名之間唯一的不兼容性是:

  • 文件名中允許的字符
  • 特殊名稱和
  • 大小寫

Windows is more restrictive in the first two accounts(這是,它有更多的禁用字符和更特殊的名稱),而Unix通常區分大小寫。這裏有一些answers這裏列出了這些字符和名稱。我會看看我能否找到它們。

現在,如果您的開發環境帶有創建或操作路徑的函數,您應該使用它,它在那裏是有原因的,你知道。特別是考慮到比Windows和Unix有更多的平臺。

回答你的第一個問題,是的../dir/file將工作,除非他們遇到了上述的一些不兼容問題。

+0

不要忘記區分大小寫的區別。 – 2009-10-27 21:35:29

11

我從來沒有使用..有任何問題,但它可能是一個好主意,使用os.path.abspath將其轉換爲絕對路徑。其次,我會建議儘可能使用os.path.join。在加入路徑中有很多角落案例(除了可移植性問題),並且不必擔心它們。例如:

>>> '/foo/bar/' + 'qux' 
'/foo/bar/qux' 
>>> '/foo/bar' + 'qux' 
'/foo/barqux' 
>>> from os.path import join 
>>> join('/foo/bar/', 'qux') 
'/foo/bar/qux' 
>>> join('/foo/bar', 'qux') 
'/foo/bar/qux' 

您可以使用..如果你是在一些不起眼的平臺上運行出現問題,但我不能說出任何(Windows中,* nix中,和OS X都支持該符號)。

3

它可以在Windows上運行,所以如果你將「無論何種平臺」定義爲Unix和Windows,那就沒問題。

另一方面,Python也運行在VMS,RISC OS和其他使用完全不同文件名約定的奇怪平臺上。然而,試圖讓你的應用程序在VMS上運行的可能性是盲目的 - 無論如何,「過早的可移植性是一些相對較小的惡意的根源」

無論如何,我喜歡使用os.path函數,因爲它們適用於表達意圖 - 而不僅僅是一個字符串連接,它可以用於上百萬個目的中的任何一個,它非常明確地表示爲路徑操作。

0

正如其他人所說的,在所有情況下都會使用正斜槓,但您最好創建一個路徑段列表和os.path.join() - 它們。