Intereting Posts
Как я могу удалить порт USB? Получение ошибок при установке php на ubuntu16.04 Виртуальное устройство при запуске в зависании Geniseotion (Force Close) на Ubuntu 12.04 Программное обеспечение GNOME не будет устанавливать Google Chrome Как создать компьютерную лабораторию для школы? Как добавить дополнительную звуковую дорожку к существующему видео Как увеличить количество «недавно использованных приложений» на панели управления? Почему Grub2 не использует пользовательское разрешение? Как связать еще один ключ для возврата? python3 может участвовать в вскрытии приложений Ubuntu? LTS 14.04 – Geforce GTX 970M по-прежнему не работает после нескольких инсталляций / обучающих программ 12.10 – Touchegg: невозможно добавить репозиторий безопасно удалить с помощью командной строки Как подключиться к Интернету через командную строку? Движение мыши + нажатие клавиши = прокрутка

Почему некоторые скрипты python начинаются с #! / Usr / bin / env python?

Я заметил, что некоторые скрипты python начинаются с #!/usr/bin/env python вместо #!/usr/bin/python .

Являются ли скрипты python единственными, которые используют #!/usr/bin/env ? Существуют ли какие-либо сценарии, начинающиеся с, например, #!/usr/bin/env bash или #!/usr/bin/env perl ? Если нет, то почему сценарии python отличаются?

Использование env в скрипте скрипта

Скрипты Python не отличаются от сценариев на любом другом языке.

Либо использование #!/usr/bin/env python либо #!/usr/bin/python играет роль, если скрипт является исполняемым и вызывается без предшествующего языка. Затем скрипт вызывает интерпретатор языка для запуска кода внутри скрипта, а shebang – это «руководство», чтобы найти в вашем примере python .

Используя #!/usr/bin/env python вместо абсолютного (полный путь) #!/usr/bin/python убедитесь, что python (или интерпретатор любого другого языка) найден, если он не может находиться точно в одном месте в разных дистрибутивах Linux или Unix, как это описано здесь .

Хотя #!/usr/bin/python будет работать в системе Ubuntu по умолчанию, поэтому рекомендуется использовать #!/usr/bin/env python .

О проекте env

env – это исполняемый файл в /usr/bin или , как упоминалось в @hvd (спасибо за подсказку!), доступный как символическая совместимость в /usr/bin для env , почти во всех дистрибутивах Linux.

Из Википедии :


env – команда оболочки для Unix и Unix-подобных операционных систем. Он используется для печати списка переменных среды или запуска другой утилиты в измененной среде без необходимости изменения существующей среды. Используя env, переменные могут быть добавлены или удалены, а существующие переменные могут быть изменены путем присвоения им новых значений.

и в связи с вашим вопросом:

На практике env имеет еще одно общее применение. Он часто используется сценариями оболочки для запуска правильного интерпретатора. При этом использовании среда обычно не изменяется


Подробнее о env можно найти здесь и, как всегда, в man env (с терминала).


Дополнительная информация о shebang; почему не работает #! python?

В комментарии было спрошено, почему мы не можем просто использовать #!python как shebang. Поскольку интерпретатор находится в $PATH , идея понятна.

Причина в том, что исполняемый файл выполняется execve , как мы можем прочитать здесь . В частности, строки:

Сценарий интерпретатора представляет собой текстовый файл с разрешенным разрешением на выполнение и первая строка которого имеет вид:

#! interpreter [optional-arg]

Интерпретатор должен быть допустимым именем для исполняемого файла ….

объясните, что execve требует полного (действительного) пути к интерпретатору. Это имеет смысл, поскольку скрипты (на любом языке) могут, например, запускаться в любой момент во время запуска, возможно, до того, как будет установлен параметр $PATH .

Ответ Джейкоба объясняет это хорошо. Однако есть еще один момент, который я хотел бы упомянуть.

Использование /usr/bin/env/ in python служит еще одной цели. Поскольку python поддерживает виртуальные среды , использование /usr/bin/env python гарантирует, что ваши скрипты будут работать внутри виртуальной среды, если вы находитесь внутри одного. Принимая во внимание, что /usr/bin/python будет работать за пределами виртуальной среды.

В дополнение к приведенным выше ответам использование /usr/bin/env позволяет устанавливать Python в нестандартных местах, и до тех пор, пока ваш PATH настроен правильно, скрипт будет запускаться без изменений на любом UNIX- которая имеет /usr/bin/env . Это включает в себя любую современную версию Linux и OS / X.