2009-04-22 6 views
14

Ich verwende häufig os.path.exists(), um zu überprüfen, ob eine Datei vorhanden ist, bevor Sie irgendetwas damit machen.os.path.exists() für Dateien in Ihrem Pfad?

Ich habe über eine Situation, in der ich eine ausführbare Datei, die in der konfigurierten env Pfad ist, aufgerufen, so dass es ohne Angabe der abspath aufgerufen werden kann.

Gibt es etwas, das, wenn die Datei, um sie vor dem Aufruf existiert überprüfen kann getan werden? (Ich kann auf try/except zurückfallen, aber zuerst suche ich nach einem Ersatz für os.path.exists())

btw - ich tue das auf Windows.

+0

Es ist nicht ausreichend ist zu prüfen, ob Es existiert; Sie müssen sicherstellen, dass es ausführbar ist, zumindest unter UNIX. –

Antwort

13

Sie könnten die PATH-Umgebungsvariable abrufen und "exists()" für die EXE-Datei in jedem Verzeichnis im Pfad versuchen. Aber das könnte schrecklich funktionieren.

Beispiel für die Suche nach notepad.exe:

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

gescheites Beispiel:

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 

Gibt es einen bestimmten Grund, warum Sie Ausnahme vermeiden wollen? (Neben Dogma?)

+0

Ich habe bestehenden Code, den ich verschieben möchte, um Dateien im Pfad zu akzeptieren. Es ist also einfacher, os.path.exists() zu ersetzen, anstatt den Code zu restrukturieren. : P – monkut

+0

Danke, ich habe Ihr Beispiel verwendet und eine Funktion zum Ersetzen von os.path.exists() erstellt. Beachten Sie, dass os.enviorn ['PATH'] eine einzelne Zeichenkette zurückgibt, daher müssen Sie sie unter Verwendung des Trennzeichens in Windows ";" trennen. – monkut

+0

Ahh, es hat funktioniert. Tut mir leid, dass ich den Split vergessen habe. –

0

Auf Unix haben Sie die PATH var aufzuspalten.

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

nein du nicht, du musst os verwenden.pathsep, damit es überall funktioniert. – SilentGhost

2

Bitte beachten Sie, dass die Prüfung auf Vorhandensein und Öffnung immer für Rennbedingungen offen ist. Die Datei kann zwischen der Überprüfung Ihres Programms und dem nächsten Zugriff auf die Datei verschwinden, da andere Programme weiterhin auf dem Computer ausgeführt werden.

Es kann also immer noch eine Ausnahme ausgelöst werden, obwohl Ihr Code "sicher" ist, dass die Datei existiert. Dies ist schließlich, warum sie Ausnahmen genannt werden.

2

Im Allgemeinen sollten Sie os.path.exists nicht versuchen, herauszufinden, ob etwas erfolgreich sein wird. Sie sollten es einfach versuchen und wenn Sie möchten, können Sie die Ausnahme behandeln, wenn es fehlschlägt.

3

Erweiterung Trey Stouts Suche mit Carl Meyers Kommentar über 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: Dank Aviv (auf meinem Blog) Ich weiß, jetzt gibt es eine Twisted-Implementierung: twisted.python.procutils.which

Verwandte Themen