fonction équivalente "which" en Python
 j'ai besoin de configurer l'environnement en lançant la commande which abc .
Existe-t-il une fonction Python équivalente à la commande     which    ?
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
8 réponses
 je sais que c'est une question plus ancienne, mais si vous utilisez Python 3.3+ vous pouvez utiliser shutil.which(cmd) . Vous trouverez la documentation    ici    . Il a l'avantage d'être dans la bibliothèque standard.  
un exemple serait ainsi:
>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
 il n'y a pas de commande pour faire cela, mais vous pouvez itérer sur environ["PATH"] et regarder si le fichier existe, ce qui est en fait ce que which  fait.  
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!
vous pourriez essayer quelque chose comme:
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 , alors votre commande sera exécutée à travers le shell système, qui trouvera automatiquement le binaire sur le chemin:  
p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
C'est l'équivalent de la commande, qui non seulement vérifie si le fichier existe, mais 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 en une ligne de 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 suit:
>>> which("ls")
'/bin/ls'