Ich muss die Umgebung mit dem Pfad zu einer Binärdatei einrichten. In der Shell kann ich which
den Pfad finden. Gibt es ein Äquivalent in Python? Das ist mein Code.
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
which
ist es keine gute Wahl, um festzustellen, ob ein Befehl installiert ist. ReferenzAntworten:
Es gibt
distutils.spawn.find_executable()
.quelle
PATH
überwhere.exe
) für mich unter Windows.import distutils.spawn
.Ich weiß, dass dies eine ältere Frage ist, aber wenn Sie Python 3.3+ verwenden, können Sie diese verwenden
shutil.which(cmd)
. Die Dokumentation finden Sie hier . Es hat den Vorteil, in der Standardbibliothek zu sein.Ein Beispiel wäre wie folgt:
>>> import shutil >>> shutil.which("bash") '/usr/bin/bash'
quelle
Es gibt keinen Befehl, um dies zu tun, aber Sie können durchlaufen
environ["PATH"]
und prüfen , ob die Datei vorhanden ist, was tatsächlich derwhich
Fall ist.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
Viel Glück!
quelle
os.path.sep
anstelle von/
undos.pathsep
anstelle von:
( Ähnliche Frage )
Siehe die Twisted-Implementierung: twisted.python.procutils.which
quelle
Sie könnten Folgendes versuchen:
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
quelle
PATHEXT
berücksichtigenWenn Sie verwenden
shell=True
, wird Ihr Befehl über die System-Shell ausgeführt, die automatisch die Binärdatei auf dem Pfad findet:p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
quelle
shell=True
es im Pfad nachgeschlagen, aber es hilft nicht, wenn Sie herausfinden möchten, welcher der möglichen Befehle vorhanden ist.Dies entspricht dem Befehl which, der nicht nur prüft, ob die Datei vorhanden ist, sondern auch, ob sie ausführbar ist:
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
quelle
Hier ist eine einzeilige Version früherer Antworten:
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)
wie folgt verwendet:
>>> which("ls") '/bin/ls'
quelle
TypeError: list object is not an iterator
.