Почему некоторые сценарии 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 отличаются?

46
задан 9 April 2019 в 00:34

3 ответа

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

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

20
ответ дан 22 November 2019 в 23:56

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

7
ответ дан 22 November 2019 в 23:56

Используя ENV в хижине сценария

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

Любой использование #!/usr/bin/env python или #!/usr/bin/python играет роль, если сценарий является исполняемым файлом, и названный без предыдущего языка. Сценарий затем называет интерпретатор языка для выполнения кода в сценарии, и хижина является "руководством" для нахождения в примере, 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 (от терминала).


Дополнительная информация о хижине; почему не делает #! работа Python?

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

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

Сценарий интерпретатора является текстовым файлом, который имеет, выполняются, разрешение включило и чья первая строка имеет форму:

#! interpreter [optional-arg]

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

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

54
ответ дан 22 November 2019 в 23:56

Другие вопросы по тегам:

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