Why do people write "#!/usr/bin/env python" on the first line of a Python script?
Почему люди пишут "#!/usr / bin /env python" в первой строке скрипта на Python?
Я вижу это в верхней части файлов Python:
#!/usr/bin/env python
#!/usr/bin/env python3
Мне кажется, что файлы выполняются одинаково без этой строки.
Переведено автоматически
Ответ 1
Если у вас установлено несколько версий Python, /usr/bin/env убедитесь, что используемый интерпретатор является первым в вашей среде $PATH. Альтернативой может быть жесткий код, что-то вроде #!/usr/bin/python; это нормально, но менее гибко.
В Unix исполняемый файл, предназначенный для интерпретации, может указывать, какой интерпретатор использовать, имея #! в начале первой строки, за которым следует интерпретатор (и любые флаги, которые ему могут понадобиться).
Если вы говорите о других платформах, конечно, это правило неприменимо (но эта "шаблонная строка" не причиняет вреда и поможет, если вы когда-нибудь скопируете этот скрипт на платформу с базой Unix, такую как Linux, Mac и т.д.).
В вычислительной технике shebang (также называемый hashbang, хэшплингом, poundbang или crunchbang) ссылается на символы "#!", когда они являются первыми двумя символами в директиве интерпретатора в качестве первой строки текстового файла. В Unix-подобной операционной системе загрузчик программы принимает наличие этих двух символов как указание на то, что файл является скриптом, и пытается выполнить этот скрипт, используя интерпретатор, указанный в остальной части первой строки файла.
Даже в Windows, где строка shebang не определяет интерпретатор, который будет запущен, вы можете передать параметры интерпретатору, указав их в строке shebang. Я считаю полезным сохранять общую строку shebang в одноразовых скриптах (таких как те, которые я пишу, отвечая на вопросы по Stack Overflow), чтобы я мог быстро протестировать их как в Windows, так и в Arch Linux.
Первый оставшийся аргумент указывает имя вызываемой программы; он ищется в соответствии с PATH переменной окружения. Все оставшиеся аргументы передаются в качестве аргументов этой программе.
Ответ 3
Немного расширяя другие ответы, вот небольшой пример того, как ваши скрипты командной строки могут попасть в беду из-за неосторожного использования /usr/bin/env шаблонных строк:
$ ./my_script.py Traceback (most recent call last): File "./my_script.py", line 2, in <module> import json ImportError: No module named json
Модуль json не существует в Python 2.5.
Один из способов защититься от такого рода проблем - использовать версионные имена команд python, которые обычно устанавливаются с большинством Python:
Чтобы запустить скрипт на python, нам нужно сообщить оболочке три вещи:
Что файл является скриптом
Каким интерпретатором мы хотим выполнить скрипт
Путь к указанному интерпретатору
Ошибка #! выполняется (1.). Ошибка начинается с # потому что # символ является маркером комментария во многих скриптовых языках. Таким образом, содержимое строки shebang автоматически игнорируется интерпретатором.
Обычно команда env используется для запуска интерпретаторов, используя тот факт, что env будет искать в $PATH команду, которую ему указано запустить. Поскольку строка shebang требует указания абсолютного пути, и поскольку расположение различных интерпретаторов (perl, bash, python) может сильно различаться, обычно используется:
#!/usr/bin/env perl вместо того, чтобы пытаться угадать, является ли это /bin /perl, /usr/bin /perl, /usr/local/bin /perl, /usr/local /pkg /perl, /fileserver/usr/bin /perl или /home/MrDaniel/usr/bin / perl в системе пользователя...
С другой стороны, env почти всегда находится в /usr/bin/env . (За исключением случаев, когда это не так; некоторые системы могут использовать /bin/env, но это довольно редкий случай и происходит только в системах, отличных от Linux.)