2009-04-22 10 views
14

Io di solito uso os.path.exists() per verificare se un file è lì prima di fare qualcosa con esso.os.path.exists() per i file nel percorso?

Ho attraversato una situazione in cui sto chiamando un eseguibile che si trova nel percorso env configurato, quindi può essere chiamato senza specificare lo abspath.

C'è qualcosa che si può fare per verificare se il file esiste prima di chiamarlo? (posso ripiegare su try/except, ma prima sto cercando un sostituto per os.path.exists())

btw - Lo sto facendo su Windows.

+0

Non è sufficiente verificare che esiste; è necessario verificare che sia eseguibile, almeno su UNIX. –

risposta

13

È possibile ottenere la variabile di ambiente PATH e provare "exists()" per l'exe in ciascuna directory del percorso. Ma quello potrebbe funzionare in modo orribile.

esempio per la ricerca di notepad.exe:

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

esempio più intelligente:

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 

C'è un motivo specifico che si desidera evitare di eccezione? (oltre dogma?)

+0

Ho il codice esistente che vorrei spostare per accettare i file nel percorso. Quindi è più semplice sostituire os.path.exists() invece di ristrutturare il codice. : P – monkut

+0

Grazie, ho usato il tuo campione e ho creato una funzione per sostituire os.path.exists(). Si noti che os.enviorn ['PATH'] restituisce una singola stringa, quindi è necessario dividerlo usando il separatore, in windows ";". – monkut

+0

Ah, felice che abbia funzionato. Mi dispiace per aver dimenticato la scissione. –

0

Su Unix devi dividere il PATH var.

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

no, non è necessario, è necessario utilizzare os.pathep per farlo funzionare ovunque. – SilentGhost

2

Si prega di notare che il controllo dell'esistenza e quindi l'apertura è sempre aperto alle condizioni di gara. Il file può scomparire tra il controllo del programma e il successivo accesso al file, dal momento che altri programmi continuano a essere eseguiti sulla macchina.

Quindi potrebbe essere generata un'eccezione, anche se il codice è "certo" che il file esiste. Questo è, dopo tutto, il motivo per cui vengono chiamate eccezioni.

2

Generalmente non si dovrebbe os.path.exists cercare di capire se qualcosa avrà successo. Dovresti solo provarlo e se vuoi puoi gestire l'eccezione se fallisce.

3

L'estensione di ricerca di Trey Stout con il commento di Carl Meyer su 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: Grazie per Aviv (sul mio blog) ora so c'è un'implementazione twisted: twisted.python.procutils.which

Problemi correlati