2009-04-22 24 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