Подтвердить что ты не робот

"какая" эквивалентная функция в 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
4b9b3361

Ответ 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

Удачи!

Ответ 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'