Os.path.exists() для файлов на вашем пути?
Я обычно использую os.path.exists()
, чтобы проверить, есть ли файл, прежде чем что-либо делать с ним.
Я столкнулся с ситуацией, когда я вызываю исполняемый файл, который в сконфигурированном env-пути, поэтому его можно вызвать без указания abspath
.
Есть ли что-то, что можно сделать, чтобы проверить, существует ли файл до его вызова?
(Я могу вернуться на try/except
, но сначала я ищу замену для os.path.exists()
)
btw - я делаю это на окнах.
Ответы
Ответ 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()