Это происходит, когда вы пытаетесь получить доступ к элементу массива с синтаксисом с квадратной скобкой, но вы делаете это по строке, а не по массиву, поэтому операция явно не имеет смысла .
Пример:
$var = "test";
echo $var["a_key"];
Если вы считаете, что переменная должна быть массивом, см., где она появляется и исправить там проблему.
Самым легким путем я могу думать:
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, кажется, не поощряют заключенные в кавычки объекты ПУТИ.
Существует сценарий which.py в стандартном распределении Python (например, в Windows '\PythonXX\Tools\Scripts\which.py'
).
РЕДАКТИРОВАНИЕ: which.py
зависит от ls
поэтому, это не является межплатформенным.
Так в основном Вы хотите найти файл в смонтированной файловой системе (не обязательно только в каталогах PATH) и проверка, если это - исполняемый файл. Это переводит в следующий план:
, я сказал бы, делание этого портативным способом потребует большой вычислительной мощности и время. Это действительно, в чем Вы нуждаетесь?
Это казалось бы очевидным , выбор - "который", анализируя результаты через popen, но Вы могли моделировать его иначе использование класса OS. В псевдо-Python это было бы похоже на это:
for each element r in path:
for each file f in directory p:
if f is executable:
return True
можно сказать, существует ли файл с модулем OS. исполняемый файл в особенности кажется довольно непортативным рассмотрением, что большим количеством вещей является исполняемый файл на, отклоняют, которые не находятся на окнах и наоборот.
См. модуль os.path для некоторых полезных функций на путях. Чтобы проверить, является ли существующий файл исполняемым файлом, используйте os.access (путь, режим) , с OS. Режим X_OK.
OS. Значение X_OK
для включения в параметр режима доступа (), чтобы определить, может ли путь быть выполнен.
РЕДАКТИРОВАНИЕ: предложенный which()
реализации пропускают одну подсказку - использование os.path.join()
для создания полных имен файлов.
Просто не забудьте определять расширение файла на окнах. Иначе необходимо записать очень сложный 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
Ни один из предыдущих примеров не работает на всех платформах. Обычно они не работают в Windows, потому что вы можете выполнить без расширения файла и , которые вы можете зарегистрировать новое расширение. Например, в Windows, если python хорошо установлен, достаточно выполнить 'file.py', и он будет работать.
Единственным допустимым и переносимым решением, которое у меня было, было выполнить команду и увидеть код ошибки. Любой достойный исполняемый файл должен иметь набор параметров вызова, который ничего не будет делать.
Важный вопрос: « Почему нужно проверять, существует ли исполняемый файл?» Может, нет? ;-)
Недавно мне понадобилась эта функция для запуска программы просмотра файлов PNG. Я хотел перебрать несколько предопределенных программ просмотра и запустить первую из существующих. К счастью, я наткнулся на os.startfile
. Это намного лучше! Простой, переносимый и использует программу просмотра по умолчанию в системе:
>>> os.startfile('yourfile.png')
Обновление: Я ошибался насчет переносимости os.startfile
... Это только Windows. На Mac вам нужно запустить команду open
. И xdg_open
в Unix. Возникла проблема Python при добавлении поддержки Mac и Unix для os.startfile
.