我通常使用os.path.exists()
來檢查一個文件是否存在,然後再做任何事情。os.path.exists()爲您的路徑中的文件?
我已經運行了一個情況,我調用了配置的env路徑中的可執行文件,因此可以在不指定abspath
的情況下調用它。
有沒有什麼辦法可以在調用之前檢查文件是否存在? (我可能會回落try/except
,但首先我要找的替代品os.path.exists()
)
btw - 我在Windows上這樣做。
我通常使用os.path.exists()
來檢查一個文件是否存在,然後再做任何事情。os.path.exists()爲您的路徑中的文件?
我已經運行了一個情況,我調用了配置的env路徑中的可執行文件,因此可以在不指定abspath
的情況下調用它。
有沒有什麼辦法可以在調用之前檢查文件是否存在? (我可能會回落try/except
,但首先我要找的替代品os.path.exists()
)
btw - 我在Windows上這樣做。
您可以獲取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
有你想要避免異常的具體原因是什麼? (除了教條?)
在Unix上,你必須拆分PATH變種。
if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]):
do_something()
請注意,檢查存在然後打開總是對比賽條件開放。該文件可以在程序的檢查和下一次訪問文件之間消失,因爲其他程序會繼續在機器上運行。
因此,即使您的代碼「確定」該文件存在,仍可能會拋出異常。畢竟,這就是爲什麼他們被稱爲例外。
你通常不應該os.path.exists試圖找出是否會成功。你應該嘗試一下,如果你想要,你可以處理異常,如果它失敗。
擴展特雷粗壯的與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
這是不夠的檢查它存在;您至少需要檢查它是否可執行。 – 2013-01-13 21:36:35