2009-04-22 5 views
14

J'utilise couramment os.path.exists() pour vérifier si un fichier est là avant de faire quoi que ce soit avec.os.path.exists() pour les fichiers de votre Path?

J'ai couru à travers une situation où j'appelle un exécutable qui est dans le chemin env configuré, ainsi il peut être appelé sans spécifier le abspath.

Y at-il quelque chose qui peut être fait pour vérifier si le fichier existe avant de l'appeler? (je retomber sur try/except, mais d'abord je suis à la recherche d'un remplaçant pour os.path.exists())

BTW - Je fais cela sur les fenêtres.

+0

Il ne suffit pas de vérifier que ça existe; vous devez vérifier que c'est exécutable, sur UNIX au moins. –

Répondre

13

Vous pouvez obtenir la variable d'environnement PATH et essayer "exists()" pour le fichier .exe dans chaque répertoire du chemin. Mais cela pourrait fonctionner horriblement.

exemple pour trouver notepad.exe:

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

exemple plus intelligent:

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 

Y at-il une raison spécifique que vous voulez éviter exception? (en dehors du dogme?)

+0

J'ai du code existant que je voudrais déplacer pour accepter les fichiers dans le chemin. Il est donc plus facile de remplacer os.path.exists() au lieu de restructurer le code. : P – monkut

+0

Merci, j'ai utilisé votre exemple et fait une fonction pour remplacer os.path.exists(). Notez que os.enviorn ['PATH'] renvoie une seule chaîne, vous devez donc la diviser en utilisant le séparateur, dans Windows ";". – monkut

+0

Ahh heureux que cela a fonctionné. Désolé d'oublier la scission. –

0

Sous Unix, vous devez diviser le chemin var.

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

non, vous devez utiliser os.Pathsep pour le faire fonctionner n'importe où. – SilentGhost

2

Veuillez noter que la vérification de l'existence et de l'ouverture est toujours ouverte aux conditions de course. Le fichier peut disparaître entre la vérification de votre programme et son prochain accès au fichier, puisque d'autres programmes continuent à fonctionner sur la machine.

Ainsi, une exception peut toujours être levée, même si votre code est «certain» que le fichier existe. C'est, après tout, pourquoi on les appelle des exceptions.

2

Vous ne devriez généralement pas os.path.exists pour essayer de savoir si quelque chose va réussir. Vous devriez juste l'essayer et si vous voulez vous pouvez manipuler l'exception si elle échoue.

3

L'extension de la recherche de Trey Stout avec le commentaire de Carl Meyer sur 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: Merci à Aviv (sur mon blog) Je sais que maintenant il y a une implémentation Twisted: twisted.python.procutils.which

Questions connexes