¿Probar si el ejecutable existe en Python?
En Python, ¿existe una forma sencilla y portátil de probar si existe un programa ejecutable?
Por simple me refiero a algo como el which
comando 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
)
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()
.
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.
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, devuelva
None
.
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 which
comando en sistemas tipo Unix (y la pedante persona POSIX dice: "nunca uses which cmd
, usa command -v cmd
, es más portátil") :-).