Necesito configurar el entorno con la ruta a un binario. En el caparazón, puedo usar which
para encontrar la ruta. ¿Existe un equivalente en Python? Este es mi codigo.
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
which
no es una buena opción para detectar si un comando está instalado. ReferenciaRespuestas:
Hay
distutils.spawn.find_executable()
.fuente
PATH
través dewhere.exe
) para mí en Windows.import distutils.spawn
primero.Sé que esta es una pregunta anterior, pero si está usando Python 3.3+, puede usar
shutil.which(cmd)
. Puede encontrar la documentación aquí . Tiene la ventaja de estar en la biblioteca estándar.Un ejemplo sería así:
>>> import shutil >>> shutil.which("bash") '/usr/bin/bash'
fuente
No hay un comando para hacer eso, pero puede iterar
environ["PATH"]
y ver si el archivo existe, que es en realidad lo quewhich
hace.import os def which(file): for path in os.environ["PATH"].split(os.pathsep): if os.path.exists(os.path.join(path, file)): return os.path.join(path, file) return None
¡Buena suerte!
fuente
os.path.sep
lugar de/
y enos.pathsep
lugar de:
( Pregunta similar )
Vea la implementación Twisted: twisted.python.procutils.which
fuente
Puede probar algo como lo siguiente:
import os import os.path def which(filename): """docstring for which""" locations = os.environ.get("PATH").split(os.pathsep) candidates = [] for location in locations: candidate = os.path.join(location, filename) if os.path.isfile(candidate): candidates.append(candidate) return candidates
fuente
PATHEXT
en cuentaSi lo usa
shell=True
, su comando se ejecutará a través del shell del sistema, que encontrará automáticamente el binario en la ruta:p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
fuente
shell=True
él, se busca en la ruta, pero no ayuda si desea encontrar cuál de los posibles comandos existe.Este es el equivalente del comando which, que no solo verifica si el archivo existe, sino también si es ejecutable:
import os def which(file_name): for path in os.environ["PATH"].split(os.pathsep): full_path = os.path.join(path, file_name) if os.path.exists(full_path) and os.access(full_path, os.X_OK): return full_path return None
fuente
Aquí hay una versión de una línea de respuestas anteriores:
import os which = lambda y: next(filter(lambda x: os.path.isfile(x) and os.access(x,os.X_OK),[x+os.path.sep+y for x in os.getenv("PATH").split(os.pathsep)]),None)
usado así:
>>> which("ls") '/bin/ls'
fuente
TypeError: list object is not an iterator
.