2013-01-05 173 views
3

我在Python中處理路徑的方式有些困惑。使用常見的結構行「〜」或「。」或「..」,我經常會遇到路徑無法識別爲有效或現有的情況,特別是如果我將路徑作爲參數傳遞給shell命令;但我的問題都消失,如果我總是做這樣的事情:確保Python中可靠路徑的最佳方法是什麼?

some_path = os.path.abspath(os.path.expanduser(some_path)) 

這是一個共同的 - 或者甚至需要 - 成語,還是我只是重新發明輪子?我應該真的期望,無論我在哪裏,只要有some_path,我都應該有上面的代碼,然後才能將它傳遞給任何(或至少大部分)使用它的任何函數?

回答

2

是的,你可以調用的大多數東西都會指望已經穿過那個習語的路徑。當你在shell中使用類似的路徑時(例如,當你做類似cat ~raxacoricofallapatorius/foo.txt的事情時),它是shell本身 - 而不是cat或你可能運行的任何其他程序 - 它執行路徑規範化。

您可以驗證這個平凡 - 例如,

[email protected]:~/Projects$ echo ~ 
/home/lvc 

那麼這是否意味着,如果你希望得到這些類型的變量作爲輸入的路徑,你需要做預處理自己。另一種方法是通過shell運行這些命令,並準備好處理帶來的所有問題

但是,至少在類Unix系統(Windows可能會或可能不會行爲相同的方式),你需要爲...做到這一點 - 這是由系統調用的理解,以及shell不會改變他們 - 所以,如:

注意file看到..不變,但看到的~擴展形式。

這意味着如果你想要的只是直接在外部程序中工作的路徑,那麼通過expanduser和可能的expandvars就足夠了。如果您要呼叫的程序將運行在與您的目錄不同的工作目錄中,您將需要撥打abspath

+0

首先調用哪個函數 - 「expandvars」還是'expanduser'? – orome

-1

它通常是一個好主意。 os.path.abspath將解析相對路徑,如。,..和〜。如果你希望你的代碼可以跨操作系統移植,你應該使用os.path而不是定義你自己的路徑處理,如果可以的話 - os.path總是指向你所在操作系統的正確路徑模塊。如果您嘗試定義自己的路徑函數,則會失去os.path的內置跨平臺行爲。

相關問題