Проверить, существует ли исполняемый файл в Python? - PullRequest
267 голосов
/ 18 декабря 2008

В Python есть ли портативный и простой способ проверить, существует ли исполняемая программа?

Под простым я подразумеваю что-то вроде which команды, которая была бы просто идеальной. Я не хочу искать PATH вручную или что-то, связанное с попыткой выполнить его с помощью Popen & al, и посмотреть, не получится ли это (это то, что я делаю сейчас, но представьте, что это launchmissiles)

Ответы [ 21 ]

2 голосов
/ 12 октября 2011

Я нашел что-то в StackOverflow, которое решило проблему для меня. Это работает при условии, что исполняемый файл имеет параметр (например, --help или --version), который выводит что-то и возвращает нулевое состояние выхода. См. Подавление вывода при вызовах Python к исполняемым файлам - «результат» в конце фрагмента кода в этом ответе будет нулевым, если исполняемый файл находится в пути, иначе он, скорее всего, будет равен 1.

2 голосов
/ 14 октября 2013

Это кажется достаточно простым и работает как в Python 2, так и в 3

.
try: subprocess.check_output('which executable',shell=True)
except: sys.exit('ERROR: executable not found')
1 голос
/ 06 ноября 2014

Вы можете попробовать внешнюю библиотеку под названием "sh" (http://amoffat.github.io/sh/).

import sh
print sh.which('ls')  # prints '/bin/ls' depending on your setup
print sh.which('xxx') # prints None
1 голос
/ 17 апреля 2015

Добавлена ​​поддержка Windows

def which(program):
    path_ext = [""];
    ext_list = None

    if sys.platform == "win32":
        ext_list = [ext.lower() for ext in os.environ["PATHEXT"].split(";")]

    def is_exe(fpath):
        exe = os.path.isfile(fpath) and os.access(fpath, os.X_OK)
        # search for executable under windows
        if not exe:
            if ext_list:
                for ext in ext_list:
                    exe_path = "%s%s" % (fpath,ext)
                    if os.path.isfile(exe_path) and os.access(exe_path, os.X_OK):
                        path_ext[0] = ext
                        return True
                return False
        return exe

    fpath, fname = os.path.split(program)

    if fpath:
        if is_exe(program):
            return "%s%s" % (program, path_ext[0])
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            path = path.strip('"')
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return "%s%s" % (exe_file, path_ext[0])
    return None
1 голос
/ 25 августа 2009

Важный вопрос: " Почему вам нужно проверить, существует ли исполняемый файл?" Может, нет? ;-)

Недавно мне понадобилась эта функция, чтобы запустить просмотрщик для файла PNG. Я хотел перебрать несколько предопределенных зрителей и запустить первое из существующих. К счастью, я наткнулся на os.startfile. Это намного лучше! Простой, переносимый и использует стандартный просмотрщик в системе:

>>> os.startfile('yourfile.png')

Обновление: Я ошибался, считая os.startfile переносимым ... Это только для Windows. На Mac вы должны запустить команду open. И xdg_open в Unix. Существует проблема Python при добавлении поддержки Mac и Unix для os.startfile.

0 голосов
/ 18 декабря 2008

Казалось бы, очевидный выбор - это "который", анализируя результаты с помощью popen, но вы могли бы смоделировать его иначе, используя класс os. В псевдопионе это выглядело бы так:

for each element r in path:
    for each file f in directory p:
        if f is executable:
           return True
0 голосов
/ 18 декабря 2008

Таким образом, вы хотите найти файл в смонтированной файловой системе (не обязательно только в каталогах PATH) и проверить, является ли он исполняемым. Это переводит на следующий план:

  • перечислить все файлы в локально смонтированных файловых системах
  • совпадение результатов с шаблоном имени
  • для каждого найденного файла проверьте, является ли он исполняемым

Я бы сказал, что это портативное решение потребует больших вычислительных ресурсов и времени. Это действительно то, что вам нужно?

0 голосов
/ 22 июля 2009

Ни один из предыдущих примеров не работает на всех платформах. Обычно они не работают в Windows, потому что вы можете выполнить без расширения файла и , что вы можете зарегистрировать новое расширение. Например, в Windows, если python хорошо установлен, достаточно запустить file.py и он будет работать.

Единственное допустимое и переносимое решение, которое у меня было, - выполнить команду и увидеть код ошибки. Любой приличный исполняемый файл должен иметь набор параметров вызова, который ничего не будет делать.

0 голосов
/ 19 декабря 2008

В стандартном дистрибутиве Python есть скрипт which.py ​​ (например, в Windows '\PythonXX\Tools\Scripts\which.py').

РЕДАКТИРОВАТЬ: which.py зависит от ls, поэтому он не кроссплатформенный.

0 голосов
/ 03 декабря 2015

Использование библиотеки фабрики python:

from fabric.api import *

def test_cli_exists():
    """
    Make sure executable exists on the system path.
    """
    with settings(warn_only=True):
        which = local('which command', capture=True)

    if not which:
        print "command does not exist"

    assert which
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...