Тест, если исполняемый файл существует в Python?

Предупреждение: недопустимое смещение строки 'XXX'

Это происходит, когда вы пытаетесь получить доступ к элементу массива с синтаксисом с квадратной скобкой, но вы делаете это по строке, а не по массиву, поэтому операция явно не имеет смысла .

Пример:

$var = "test";
echo $var["a_key"];

Если вы считаете, что переменная должна быть массивом, см., где она появляется и исправить там проблему.

279
задан sorin 15 August 2016 в 23:43
поделиться

9 ответов

Самым легким путем я могу думать:

def which(program):
    import os
    def is_exe(fpath):
        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

Редактирование : Обновленный пример кода для включения логики для обработки случая, где, если аргументом уже является полный путь к исполняемому файлу, т.е. "который/bin/ls". Это подражает поведению UNIX, 'которые' управляют.

Редактирование : Обновленный для использования os.path.isfile () вместо os.path.exists () на комментарии.

Редактирование : path.strip('"') походит на неправильный поступок здесь. Ни Windows, ни POSIX, кажется, не поощряют заключенные в кавычки объекты ПУТИ.

317
ответ дан mar77i 23 November 2019 в 02:00
поделиться

Существует сценарий which.py в стандартном распределении Python (например, в Windows '\PythonXX\Tools\Scripts\which.py').

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

0
ответ дан jfs 23 November 2019 в 02:00
поделиться

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

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

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

0
ответ дан zgoda 23 November 2019 в 02:00
поделиться

Это казалось бы очевидным , выбор - "который", анализируя результаты через popen, но Вы могли моделировать его иначе использование класса OS. В псевдо-Python это было бы похоже на это:

for each element r in path:
    for each file f in directory p:
        if f is executable:
           return True
0
ответ дан Charlie Martin 23 November 2019 в 02:00
поделиться

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

0
ответ дан Dustin Getz 23 November 2019 в 02:00
поделиться

См. модуль os.path для некоторых полезных функций на путях. Чтобы проверить, является ли существующий файл исполняемым файлом, используйте os.access (путь, режим) , с OS. Режим X_OK.

OS. Значение X_OK

для включения в параметр режима доступа (), чтобы определить, может ли путь быть выполнен.

РЕДАКТИРОВАНИЕ: предложенный which() реализации пропускают одну подсказку - использование os.path.join() для создания полных имен файлов.

7
ответ дан gimel 23 November 2019 в 02:00
поделиться

Просто не забудьте определять расширение файла на окнах. Иначе необходимо записать очень сложный is_exe для окон с помощью PATHEXT переменная среды. Можно просто хотеть использовать FindPath.

OTOH, почему Вы даже потрудились искать исполняемый файл? Операционная система сделает это для Вас как часть popen вызов & повысит исключение, если исполняемый файл не будет найден. Все, что необходимо сделать, поймать корректное исключение для данной ОС. Обратите внимание, что в Windows, subprocess.Popen(exe, shell=True) перестанет работать тихо, если exe не будет найден.

<час>

Слияние PATHEXT в вышеупомянутую реализацию which (в ответе Jay):

def which(program):
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK) and os.path.isfile(fpath)

    def ext_candidates(fpath):
        yield fpath
        for ext in os.environ.get("PATHEXT", "").split(os.pathsep):
            yield fpath + ext

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            for candidate in ext_candidates(exe_file):
                if is_exe(candidate):
                    return candidate

    return None
18
ответ дан Guus 23 November 2019 в 02:00
поделиться

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

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

0
ответ дан 23 November 2019 в 02:00
поделиться

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

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

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

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

1
ответ дан 23 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: