Je dois configurer l'environnement en exécutant la commande which abc
. Existe-t-il une fonction équivalente à Python de la commandewhich
??. C'est mon code.
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
Il y a distutils.spawn.find_executable()
sur Python 2.4+
Je sais que c'est une question plus ancienne, mais si vous utilisez Python 3.3+, vous pouvez utiliser shutil.which(cmd)
. Vous pouvez trouver la documentation ici . Il a l'avantage d'être dans la bibliothèque standard.
Un exemple serait comme ceci:
>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
Il n'y a pas de commande pour le faire, mais vous pouvez effectuer une itération sur environ["PATH"]
et voir si le fichier existe, ce que fait en réalité which
.
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
Bonne chance!
Voir l'implémentation Twisted: twisted.python.procutils.which
Vous pouvez essayer quelque chose comme ce qui suit:
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
Si vous utilisez Shell=True
, votre commande sera exécutée via le shell du système, qui trouvera automatiquement le fichier binaire sur le chemin:
p = subprocess.Popen("abc", stdout=subprocess.PIPE, Shell=True)
C'est l'équivalent de la commande which, qui vérifie non seulement si le fichier existe, mais aussi s'il est exécutable:
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
Voici une version d'une ligne des réponses précédentes:
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)
utilisé comme tel:
>>> which("ls")
'/bin/ls'