¿Probar si el ejecutable existe en Python?

Resuelto Piotr Lesnicki asked hace 16 años • 15 respuestas

En Python, ¿existe una forma sencilla y portátil de probar si existe un programa ejecutable?

Por simple me refiero a algo como el whichcomando que sería simplemente perfecto. No quiero buscar PATH manualmente o algo que implique intentar ejecutarlo con Popen& al y ver si falla (eso es lo que estoy haciendo ahora, pero imagina que es launchmissiles)

Piotr Lesnicki avatar Dec 18 '08 12:12 Piotr Lesnicki
Aceptado

Sé que esta es una pregunta antigua, pero puedes usar distutils.spawn.find_executable. Esto ha sido documentado desde Python 2.4 y existe desde Python 1.6.

import distutils.spawn
distutils.spawn.find_executable("notepad.exe")

Además, Python 3.3 ahora ofrece shutil.which().

Nathan Binkert avatar Sep 26 '2012 22:09 Nathan Binkert

La forma más fácil que se me ocurre:

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.get("PATH", "").split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

Editar : ejemplo de código actualizado para incluir lógica para manejar casos en los que el argumento proporcionado ya es una ruta completa al ejecutable, es decir, "cuál /bin/ls". Esto imita el comportamiento del comando "cuál" de UNIX.

Editar : actualizado para usar os.path.isfile() en lugar de os.path.exists() según los comentarios.

Editar : path.strip('"')parece algo incorrecto hacer aquí. Ni Windows ni POSIX parecen fomentar la cotización de elementos PATH.

Jay avatar Dec 18 '2008 06:12 Jay

Utilice Shutil. Which() de la maravillosa biblioteca estándar de Python.

Documentado como

Devuelve la ruta a un ejecutable que se ejecutaría si se llamara al cmd dado. Si no se llama a ningún cmd, devuelvaNone .

import shutil

path = shutil.which("foo") 

if path is None:
    print("no executable found for command 'foo'")
else:
    print(f"path to executable 'foo': {path}")

Beneficios sobre las soluciones caseras: documentación, estabilidad de la interfaz, mantenimiento a largo plazo. Abogué por esta solución aquí hace ~10 años, y hace solo un mes (abril de 2023), algunos detalles relevantes mejoraron nuevamente bajo el capó de esta interfaz de alto nivel proporcionada por excelentes ingenieros que hacen el trabajo duro por usted. ¡Pilas incluidas 🔋!

Por cierto, el nombre se deriva del famoso whichcomando en sistemas tipo Unix (y la pedante persona POSIX dice: "nunca uses which cmd, usa command -v cmd, es más portátil") :-).

Dr. Jan-Philip Gehrcke avatar Dec 18 '2012 16:12 Dr. Jan-Philip Gehrcke