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

mon*_*kut 14 python windows

os.path.exists()在做任何事情之前,我经常用来检查文件是否存在.

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

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

顺便说一句 - 我在Windows上这样做.

Tre*_*out 14

您可以获取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'))
Run Code Online (Sandbox Code Playgroud)

更聪明的例子:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 要在Windows上正确地执行此操作,您可能还需要考虑os.environ ['PATHEXT']; Windows上的"notepad"可能表示"notepad.exe","notepad.bat",... (2认同)

ori*_*rip 5

用 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
Run Code Online (Sandbox Code Playgroud)

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

编辑:在Python 3.3及更高版本中,标准库中有shutil.which() 。