2009-04-22 2 views
14

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

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

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

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

+0

Это не достаточно, чтобы проверить, что это существует; вам нужно проверить, что он исполняемый, по крайней мере в UNIX. –

ответ

13

Вы можете получить переменную среды 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 

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

+0

У меня есть существующий код, который я бы хотел переместить, чтобы принимать файлы в пути. Так что проще заменить os.path.exists() вместо реструктуризации кода. : P – monkut

+0

Спасибо, я использовал ваш образец и сделал функцию для замены os.path.exists(). Обратите внимание, что os.enviorn ['PATH'] возвращает одну строку, поэтому вам нужно разбить ее с помощью разделителя в окнах «;». – monkut

+0

Ahh рад, что это сработало. Извините, что забыл о расколе. –

0

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

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

нет, нет, вам нужно использовать os.pathsep, чтобы заставить его работать где угодно. – SilentGhost

2

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

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

2

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

3

Расширение поиска Трея Стаут с комментарием Карла Мейера на 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: Благодаря Aviv (в моем блоге) теперь я знаю, что есть Twisted реализация: twisted.python.procutils.which

Смежные вопросы