2011-03-08 3 views
41

Мне нужно настроить среду, выполнив команду which abc. Есть ли эквивалентная функция Python команды which? Это мой код.«эквивалентная функция» в Python

cmd = ["which","abc"] 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
res = p.stdout.readlines() 
if len(res) == 0: return False 
return True 
+0

Даже в самой оболочке «сам» не является хорошим выбором для определения того, установлена ​​ли команда. [Ссылка] (http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212) – kojiro

ответ

61
+5

+1, это классно и часть стандартной библиотеки! Имейте в виду, что он очень ограничен в Windows - он не анализирует PATHEXT, вместо этого он предполагает, что он должен искать расширение «.exe» (отсутствующие пакетные файлы и т. Д.). – orip

+0

Отлично работает, стоит своего места в результатах Google. –

+2

Опасайтесь, он не проверяет, является ли файл исполняемым. – temoto

11

Там не команда, чтобы сделать это, но вы можете перебрать 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 

Удачи вам!

+1

Вы хотите быть осторожным, делая предположения о характере pathsep , –

+0

и разделитель путей, но это просто причуда, чтобы сделать точку. Удачи! –

+0

используйте 'os.path.sep' вместо'/'и' os.pathsep' вместо ':' – djhaskin987

4

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

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 
+0

Вам также нужно учитывать 'PATHEXT' – orip

+1

На компьютере с Windows я подозреваю, что вы, скорее всего, будете искать точное имя файла, а не предполагать расширения. С учетом сказанного, нетрудно добавить внутренний цикл, который повторяется над членами PATHEXT. –

2

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

p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True) 
+0

Даже без 'shell = True' он просматривается в пути, но это не помогает, если вы хотите найти, какая из возможных команд существует. –

22

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

Примером может выглядеть примерно так:

>>> import shutil 
>>> shutil.which("bash") 
'/usr/bin/bash' 
0

Это эквивалент, какая команда, которая не только проверяет, существует ли файл, но и является ли его исполняемым:

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 
Смежные вопросы