Назначение #! / Usr / bin / python3

160

Я заметил это на нескольких языках сценариев, но в этом примере я использую python. Во многих уроках они начинаются с #!/usr/bin/python3первой строки. Я не понимаю, почему у нас это есть.

  • Если операционная система не знает, что это скрипт на python (очевидно, он установлен, так как вы делаете на него ссылку)
  • Что делать, если пользователь использует операционную систему, не основанную на Unix
  • Язык устанавливается в другую папку по любой причине
  • У пользователя другая версия. Особенно, когда это не полный номер версии (как Python3 против Python32)

Во всяком случае, я мог видеть, что это сломало скрипт на python по перечисленным выше причинам.

KayleL
источник
stackoverflow.com/questions/2429511/…
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
9
Я пришел к этому вопросу, просто чтобы скопировать строку Шебанга.
omerjerk

Ответы:

260

#!/usr/bin/python3это линия Шебанга .

Линия Шебанга определяет, где находится переводчик. В этом случае python3переводчик находится в /usr/bin/python3. Линия A притон также может быть bash, ruby, perlпереводчик или каких - либо других языков сценариев, например: #!/bin/bash.

Без строки shebang операционная система не знает, что это скрипт на python, даже если вы установите флаг выполнения для скрипта и запустите его как ./script.py. Чтобы скрипт по умолчанию выполнялся в python3, либо вызовите его, python3 script.pyлибо установите строку shebang.

Вы можете использовать #!/usr/bin/env python3для переносимости между различными системами, если у них установлен переводчик языка в разных местах.

Jin
источник
9
Так #! /usr/bin/env python3стоит ли выбирать #! /usr/bin/python3?
winklerrr
4
@winklerrr Да, это более широко используется.
MerreM
20

Это называется хэш-бэнг. Если вы запустите скрипт из оболочки, он проверит первую строку, чтобы выяснить, какая программа должна быть запущена для интерпретации скрипта.

ОС, не основанная на Unix, будет использовать свои собственные правила для выяснения того, как запустить скрипт. Например, Windows будет использовать расширение имени файла, и #первая строка будет рассматриваться как комментарий.

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

Марк Рэнсом
источник
12

Эта строка помогает найти исполняемый файл программы, который будет запускать скрипт. Эта нотация Шебанга является довольно стандартной для большинства языков сценариев (по крайней мере, используемых во взрослых операционных системах).

Важным аспектом этой строки является указание, какой интерпретатор будет использоваться. Например, во многих дистрибутивах, ориентированных на разработку, нормально устанавливать несколько версий python одновременно.

Python 2.x и Python 3 не совместимы на 100%, поэтому это различие может быть очень важным. Так что #! /usr/bin/pythonи #! /usr/bin/python3не совпадают (и ни один не совсем такой, #! /usr/bin/env python3как отмечено в другом месте на этой странице.

zxq9
источник
6
  1. И эта линия как .

  2. Это игнорируется.

  3. Он не будет работать, и его следует изменить, чтобы он указывал на правильное местоположение. Или envследует использовать.

  4. Он не будет работать и, вероятно, не сможет работать под другой версией.

Игнасио Васкес-Абрамс
источник
3

Чтобы уточнить, как работает строка shebang для окон, из документа 3.7 Python :

  • Если первая строка файла сценария начинается с # !, она называется строкой «шебанг». Linux и другие Unix-подобные операционные системы имеют встроенную поддержку таких строк, и они обычно используются в таких системах, чтобы указать, как должен выполняться скрипт.
  • Python Launcher для Windows позволяет использовать те же возможности со скриптами Python в Windows
  • Чтобы разрешить перенос строк в сценариях Python между Unix и Windows, программа запуска поддерживает ряд «виртуальных» команд, позволяющих указать, какой интерпретатор использовать. Поддерживаемые виртуальные команды:
    • / usr / bin / env python
      • Форма / usr / bin / env линии shebang имеет еще одно специальное свойство. Прежде чем искать установленные интерпретаторы Python, эта форма будет искать в исполняемом PATH исполняемый файл Python. Это соответствует поведению программы enix Unix, которая выполняет поиск по PATH.
    • / USR / бен / питон
    • / USR / местные / бен / питон
    • питон
boardtc
источник
2

На самом деле определение того, какой тип файла является файлом, очень сложно, поэтому теперь операционная система не может просто знать. Это может сделать много догадок на основе -

  • расширение
  • ИМП
  • MIME

Но командная строка не беспокоится обо всем этом, потому что она работает на ограниченном обратно совместимом слое, с тех пор, как эта причудливая ерунда ничего не значила. Если вы дважды щелкните по нему точно, современная ОС сможет это понять, но если вы запустите его из терминала, то нет, потому что терминал не заботится о ваших модных API-интерфейсах для ввода файлов, специфичных для вашей ОС.

Что касается других пунктов. Это удобно, так же возможно запустить

python3 path/to/your/script

Если ваш питон не указан по указанному пути, он не будет работать, но мы склонны устанавливать такие вещи, чтобы эта работа работала, а не наоборот. На самом деле это не имеет значения, если вы находитесь под * nix, ваша оболочка должна учитывать эту строку, потому что это shellcode. Так, например, вы можете запустить bashпод Windows.

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

awiebe
источник