Muszę skonfigurować środowisko ze ścieżką do pliku binarnego. W powłoce mogę which
znaleźć ścieżkę. Czy jest odpowiednik w Pythonie? To jest mój kod.
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
which
sobie nie jest dobrym wyborem do wykrywania, czy polecenie jest zainstalowane. OdniesienieOdpowiedzi:
Jest
distutils.spawn.find_executable()
.źródło
PATH
poprzezwhere.exe
) dla mnie na Windows.import distutils.spawn
najpierw.Wiem, że to starsze pytanie, ale jeśli używasz Pythona 3.3+, możesz użyć
shutil.which(cmd)
. Dokumentację znajdziesz tutaj . Ma tę zaletę, że znajduje się w standardowej bibliotece.Przykład mógłby wyglądać tak:
>>> import shutil >>> shutil.which("bash") '/usr/bin/bash'
źródło
Nie ma polecenia, aby to zrobić, ale możesz iterować
environ["PATH"]
i sprawdzić, czy plik istnieje, i tak właśniewhich
jest.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
Powodzenia!
źródło
os.path.sep
zamiast/
ios.pathsep
zamiast:
( Podobne pytanie )
Zobacz implementację Twisted: twisted.python.procutils.which
źródło
Możesz spróbować czegoś takiego:
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
źródło
PATHEXT
pod uwagęJeśli użyjesz
shell=True
, twoje polecenie zostanie uruchomione przez powłokę systemową, która automatycznie znajdzie plik binarny na ścieżce:p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
źródło
shell=True
niego jest sprawdzany w ścieżce, ale nie pomaga, jeśli chcesz dowiedzieć się, które z możliwych poleceń istnieje.Jest to odpowiednik polecenia which, które nie tylko sprawdza, czy plik istnieje, ale także czy jest wykonywalny:
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
źródło
Oto jednowierszowa wersja wcześniejszych odpowiedzi:
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)
używane tak:
>>> which("ls") '/bin/ls'
źródło
TypeError: list object is not an iterator
.