Подтвердить что ты не робот

Os.path.exists() для файлов на вашем пути?

Я обычно использую os.path.exists(), чтобы проверить, есть ли файл, прежде чем что-либо делать с ним.

Я столкнулся с ситуацией, когда я вызываю исполняемый файл, который в сконфигурированном env-пути, поэтому его можно вызвать без указания abspath.

Есть ли что-то, что можно сделать, чтобы проверить, существует ли файл до его вызова? (Я могу вернуться на try/except, но сначала я ищу замену для os.path.exists())

btw - я делаю это на окнах.

4b9b3361

Ответ 1

Вы можете получить переменную среды PATH и попробовать "exists()" для .exe в каждом каталоге в пути. Но это может звучать ужасно.

пример для поиска 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

Есть ли конкретная причина, по которой вы хотите избежать исключения? (помимо догмы?)

Ответ 2

Расширение поиска Trey Stout с комментарием Карла Мейера на 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

EDIT: Благодаря Авиву (в моем блоге) теперь я знаю, что есть реализация Twisted: twisted.python.procutils.which

Ответ 3

Обратите внимание, что проверка наличия и последующего открытия всегда открыта для условий гонки. Файл может исчезнуть между проверкой программы и ее последующим доступом к файлу, так как другие программы продолжают работать на машине.

Таким образом, может возникнуть исключение, даже если ваш код "определен", что файл существует. Это, в конце концов, почему они называются исключениями.

Ответ 4

Обычно вам не следует os.path.exists пытаться выяснить, что-то будет успешным. Вы должны просто попробовать его, и если хотите, вы можете обработать исключение, если оно не выполнено.

Ответ 5

В Unix вам нужно разбить PATH var.

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