эквивалентная функция в Python - PullRequest
60 голосов
/ 08 марта 2011

Мне нужно настроить среду, запустив команду 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

Ответы [ 8 ]

82 голосов
/ 28 февраля 2013

На Python 2.4 +

есть distutils.spawn.find_executable()
47 голосов
/ 25 августа 2016

Я знаю, что это старый вопрос, но если вы используете Python 3.3+, вы можете использовать shutil.which(cmd). Вы можете найти документацию здесь . Он имеет преимущество в том, что находится в стандартной библиотеке.

Пример будет выглядеть так:

>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
12 голосов
/ 08 марта 2011
12 голосов
/ 08 марта 2011

Нет команды для этого, но вы можете выполнить итерацию по 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 голосов
/ 08 марта 2011

Вы можете попробовать что-то вроде следующего:

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
3 голосов
/ 01 января 2018

Это эквивалент команды 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
2 голосов
/ 08 марта 2011

Если вы используете shell=True, то ваша команда будет выполняться через системную оболочку, которая автоматически найдет двоичный файл по пути:

p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
0 голосов
/ 07 апреля 2018

Вот версия предыдущих ответов в одну строку:

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'
...