"какая" эквивалентная функция в Python
Мне нужно настроить среду, запустив команду which abc
. Есть ли в Python эквивалентная функция для which
команды? Это мой код
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
Ответы
Ответ 1
На Python 2 есть distutils.spawn.find_executable()
. 4+
Вам нужно будет сделать:
import distutils.spawn
, или сделай
from distutils import spawn
Если вы просто делаете:
import distutil
, вы не сможете позвонить distutils.spawn.find_executable()
Ответ 2
Я знаю, что это старый вопрос, но если вы используете Python 3.3+, вы можете использовать shutil.which(cmd)
. Здесь вы можете найти документацию . Он имеет то преимущество, что находится в стандартной библиотеке.
Пример будет таким:
>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
Ответ 3
Нет такой команды, но вы можете перебирать environ["PATH"]
и посмотреть, существует ли файл, что на самом деле означает 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
Удачи!
Ответ 4
(Аналогичный вопрос)
См. реализацию Twisted: twisted.python.procutils.which
Ответ 5
Вы можете попробовать что-то вроде следующего:
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
Ответ 6
Если вы используете shell=True
, ваша команда будет запущена через системную оболочку, которая автоматически найдет двоичный файл на пути:
p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
Ответ 7
Это эквивалент команды which, которая не только проверяет, существует ли файл, но и является ли он исполняемым:
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
Ответ 8
Вот однострочная версия предыдущих ответов:
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)
использовал вот так:
>>> which("ls")
'/bin/ls'