2009-04-22 17 views
14

Comúnmente uso os.path.exists() para verificar si hay un archivo allí antes de hacer algo con él.os.path.exists() para archivos en su ruta de acceso?

Me he encontrado con una situación en la que llamo a un ejecutable que está en la ruta de env configurada, por lo que se puede llamar sin especificar el abspath.

¿Se puede hacer algo para verificar si el archivo existe antes de llamarlo? (Puedo recurrir a try/except, pero primero estoy buscando un reemplazo para os.path.exists())

por cierto - que estoy haciendo esto en las ventanas.

+0

No es suficiente para comprobar que existe; necesita verificar que sea ejecutable, al menos en UNIX. –

Respuesta

13

Puede obtener la variable de entorno PATH y probar "exists()" para el .exe en cada directorio en la ruta. Pero eso podría funcionar horriblemente.

ejemplo para encontrar notepad.exe:

import os 
for p in os.environ["PATH"].split(os.pathsep): 
    print os.path.exists(os.path.join(p, 'notepad.exe')) 

ejemplo más inteligente:

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 

¿Hay alguna razón específica que desea evitar excepción? (¿además del dogma?)

+0

Tengo un código existente que me gustaría mover para aceptar archivos en la ruta. Por lo tanto, es más fácil reemplazar os.path.exists() en lugar de reestructurar el código. : P – monkut

+0

Gracias, utilicé su muestra e hice una función para reemplazar os.path.exists(). Tenga en cuenta que os.enviorn ['PATH'] devuelve una sola cadena, por lo que debe dividirla usando el separador, en windows ";". – monkut

+0

Ahh me alegro de que funcionó. Perdón por olvidar la división. –

0

En Unix, tiene que dividir la varilla PATH.

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

no, no necesita usar el sistema operativo.pathsep para que funcione en cualquier lugar. – SilentGhost

2

Tenga en cuenta que la comprobación de la existencia y la apertura está siempre abierta a las condiciones de carrera. El archivo puede desaparecer entre el cheque de su programa y su siguiente acceso al archivo, ya que otros programas continúan ejecutándose en la máquina.

Por lo tanto, es posible que aún se produzca una excepción, aunque su código sea "cierto" de que el archivo existe. Esto es, después de todo, por qué se llaman excepciones.

2

En general, no debería debería os.path.exists para tratar de averiguar si algo va a tener éxito. Debería probarlo y, si lo desea, puede manejar la excepción si falla.

3

La extensión de búsqueda de Trey Stout con el comentario de Carl Meyer en 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: Gracias a Aviv (en mi blog) Ahora sé que hay una aplicación torcida: twisted.python.procutils.which

Cuestiones relacionadas