os.path.exists () для файлов в вашем пути? - PullRequest
14 голосов
/ 22 апреля 2009

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

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

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

Кстати - я делаю это на Windows.

Ответы [ 5 ]

13 голосов
/ 22 апреля 2009

Вы можете получить переменную окружения PATH и попробовать "exist ()" для .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

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

3 голосов
/ 24 августа 2009

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

РЕДАКТИРОВАТЬ: Благодаря Aviv (в моем блоге) я теперь знаю, что есть реализация Twisted: twisted.python.procutils.which

2 голосов
/ 22 апреля 2009

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

2 голосов
/ 22 апреля 2009

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

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

0 голосов
/ 22 апреля 2009

В Unix вы должны разделить переменную PATH.

if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]):
    do_something()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...