2009-04-22 38 views
14

我通常使用os.path.exists()來檢查一個文件是否存在,然後再做任何事情。os.path.exists()爲您的路徑中的文件?

我已經運行了一個情況,我調用了配置的env路徑中的可執行文件,因此可以在不指定abspath的情況下調用它。

有沒有什麼辦法可以在調用之前檢查文件是否存在? (我可能會回落try/except,但首先我要找的替代品os.path.exists()

btw - 我在Windows上這樣做。

+0

這是不夠的檢查它存在;您至少需要檢查它是否可執行。 – 2013-01-13 21:36:35

回答

13

您可以獲取PATH環境變量,並在路徑中的每個目錄中爲.exe嘗試「exists()」。但這可能會造成可怕的結果。

例如尋找NOTEPAD.EXE:

import os 
for p in os.environ["PATH"].split(os.pathsep): 
    print os.path.exists(os.path.join(p, 'notepad.exe')) 

更聰明例如:

if not any([os.path.exists(os.path.join(p, executable) for p in os.environ["PATH"].split(os.pathsep)]): 
    print "can't find %s" % executable 

有你想要避免異常的具體原因是什麼? (除了教條?)

+0

我已經有了現有的代碼,我想移到路徑中接受文件。因此,更換os.path.exists()而不是重構代碼會更容易。 :P – monkut 2009-04-22 01:21:56

+0

謝謝,我使用你的示例,並提供了一個函數來替換os.path.exists()。注意os.enviorn ['PATH']返回一個單獨的字符串,所以你需要使用分隔符在窗口「;」中分割它。 – monkut 2009-04-22 03:13:17

0

在Unix上,你必須拆分PATH變種。

if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]): 
    do_something() 
2

請注意,檢查存在然後打開總是對比賽條件開放。該文件可以在程序的檢查和下一次訪問文件之間消失,因爲其他程序會繼續在機器上運行。

因此,即使您的代碼「確定」該文件存在,仍可能會拋出異常。畢竟,這就是爲什麼他們被稱爲例外。

2

你通常不應該os.path.exists試圖找出是否會成功。你應該嘗試一下,如果你想要,你可以處理異常,如果它失敗。

3

擴展特雷粗壯的與PATHEXT卡爾·邁耶的評論搜索:

import os 
def exists_in_path(cmd): 
    # can't search the path if a directory is specified 
    assert not os.path.dirname(cmd) 

    extensions = os.environ.get("PATHEXT", "").split(os.pathsep) 
    for directory in os.environ.get("PATH", "").split(os.pathsep): 
    base = os.path.join(directory, cmd) 
    options = [base] + [(base + ext) for ext in extensions] 
    for filename in options: 
     if os.path.exists(filename): 
     return True 
    return False 

編輯:感謝特拉維夫(在我的博客),我現在知道有一個扭曲的實現:twisted.python.procutils.which