os.path.exists()用于路径中的文件?

时间:2009-04-22 01:09:32

标签: python windows

我通常使用os.path.exists()来检查文件是否存在,然后再对其进行操作。

我遇到过一种情况,我正在调用已配置的env路径中的可执行文件,因此可以在不指定abspath的情况下调用它。

在调用之前是否可以执行某些操作来检查文件是否存在? (我可能会回到try/except,但首先我正在寻找替代os.path.exists()

不过 - 我在Windows上这样做了。

5 个答案:

答案 0 :(得分: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

您是否有特殊原因要避免异常? (除了教条?)

答案 1 :(得分:3)

通过Carl Meyer对PATHEXT的评论来扩展Trey Stout的搜索:

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

编辑:感谢Aviv(在我的博客上),我现在知道有一个Twisted实现:twisted.python.procutils.which

答案 2 :(得分:2)

请注意,检查是否存在然后打开对比赛条件始终开放。由于其他程序继续在机器上运行,文件可能会在程序检查和下次访问文件之间消失。

因此,即使您的代码“确定”该文件存在,仍可能会抛出异常。毕竟,这就是他们被称为例外的原因。

答案 3 :(得分:2)

你通常不应该os.path.exists试图弄清楚某些事情是否会成功。您应该尝试一下,如果您愿意,可以在失败时处理异常。

答案 4 :(得分:0)

在Unix上,您必须拆分PATH var。

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