355 votes

Teste si l'exécutable existe en Python?

En python, est-il un ordinateur portable et un moyen simple de tester si un programme exécutable existe?

En simple, je veux dire quelque chose comme 'which' de la commande qui serait tout simplement parfait. Je ne veux pas le CHEMIN de recherche manuellement ou quelque chose impliquant d'essayer de l'exécuter avec Popen & al et voir si elle échoue (c'est ce que je fais maintenant, mais imaginez launchmissiles)

EDIT: La réponse est 'Non', à partir des différents postes, j'ai juste à la recherche d'un chemin manuellement sna utilisation de Jay réponse (désolé pour la mauvaise formulation à propos de " qui " qui, je comprends, mais j'ai pensé que peut-être il y a quelque chose dans l'os.chemin qui ne que bien que nommé étrangement).

377voto

Nathan Binkert Points 3096

Je sais que c'est une question ancienne, mais vous pouvez utiliser distutils.spawn.find_executable . Cela a été documenté depuis python 2.4 et existe depuis python 1.6. En outre, Python 3.3 offre maintenant shutil.which() .

334voto

Jay Points 20373

La façon la plus simple à laquelle je peux penser:

 def which(program):
    import os
    def is_exe(fpath):
        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            path = path.strip('"')
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None
 

Edit : Exemple de code mis à jour pour inclure une logique de gestion de cas où l'argument fourni est déjà un chemin d'accès complet à l'exécutable, c'est-à-dire "which / bin / ls". Cela imite le comportement de la commande UNIX 'which'.

Edit : Mis à jour pour utiliser os.path.isfile () à la place de os.path.exists () par commentaire.

232voto

Jan-Philip Gehrcke Points 6259

Python 3.3 offre maintenant shutil.which () .

20voto

Suraj Barkale Points 1482

N'oubliez pas de préciser l'extension de fichier sous windows. Sinon, vous devez écrire un beaucoup plus compliqué is_exe pour windows à l'aide d' PATHEXT variable d'environnement. Vous pouvez utiliser FindPath.

Otoh, que, pourquoi êtes-vous encore la peine de rechercher l'exécutable? Le système d'exploitation va le faire pour vous dans le cadre de l' popen appel & génère une exception si le fichier exécutable n'est pas trouvé. Tout ce que vous devez faire est d'attraper le bon d'exception pour les OS. Notez que sous Windows, subprocess.Popen(exe, shell=True) échoue silencieusement si exe n'est pas trouvé.


Intégrant PATHEXT dans le ci-dessus la mise en œuvre de l' which (Jay):

def which(program):
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK)

    def ext_candidates(fpath):
        yield fpath
        for ext in os.environ.get("PATHEXT", "").split(os.pathsep):
            yield fpath + ext

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            for candidate in ext_candidates(exe_file):
                if is_exe(candidate):
                    return candidate

    return None

14voto

hasenj Points 36139

Pour *nix, les plates-formes (Linux et OS X)

Cela semble fonctionner pour moi:

Modifié pour fonctionner sur Linux, grâce à Mestreion

def cmd_exists(cmd):
    return subprocess.call("type " + cmd, shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0

Ce que nous faisons ici est d'utiliser la builtin commande type et en vérifiant le code de sortie. Si il n'y a pas de commande, type sortie avec 1 (ou un non-zéro, code d'état, de toute façon).

Les bits sur la sortie standard stdout et stderr est juste pour faire taire la sortie de l' type de commande, puisque nous sommes seulement intéressés par le statut de sortie de code.

Exemple d'utilisation:

>>> cmd_exists("jsmin")
True
>>> cmd_exists("cssmin")
False
>>> cmd_exists("ls")
True
>>> cmd_exists("dir")
False
>>> cmd_exists("node")
True
>>> cmd_exists("steam")
False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X