Вопрос-Ответ

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 и т.д.).

Ответ 2

Это называется строкой shebang. Как объясняется в статье в Википедии:


В вычислительной технике shebang (также называемый hashbang, хэшплингом, poundbang или crunchbang) ссылается на символы "#!", когда они являются первыми двумя символами в директиве интерпретатора в качестве первой строки текстового файла. В Unix-подобной операционной системе загрузчик программы принимает наличие этих двух символов как указание на то, что файл является скриптом, и пытается выполнить этот скрипт, используя интерпретатор, указанный в остальной части первой строки файла.


Смотрите также раздел часто задаваемых вопросов по Unix.

Даже в Windows, где строка shebang не определяет интерпретатор, который будет запущен, вы можете передать параметры интерпретатору, указав их в строке shebang. Я считаю полезным сохранять общую строку shebang в одноразовых скриптах (таких как те, которые я пишу, отвечая на вопросы по Stack Overflow), чтобы я мог быстро протестировать их как в Windows, так и в Arch Linux.

Утилита env позволяет вызывать команду по пути:


Первый оставшийся аргумент указывает имя вызываемой программы; он ищется в соответствии с PATH переменной окружения. Все оставшиеся аргументы передаются в качестве аргументов этой программе.


Ответ 3

Немного расширяя другие ответы, вот небольшой пример того, как ваши скрипты командной строки могут попасть в беду из-за неосторожного использования /usr/bin/env шаблонных строк:

$ /usr/local/bin/python -V
Python 2.6.4

$ /usr/bin/python -V
Python 2.5.1

$ cat my_script.py
#!/usr/bin/env python
import json
print "hello, json"

$ PATH=/usr/local/bin:/usr/bin

$ ./my_script.py
hello, json

$ PATH=/usr/bin:/usr/local/bin

$ ./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:

$ cat my_script.py
#!/usr/bin/env python2.6
import json
print "hello, json"

Если вам просто нужно различать Python 2.x и Python 3.x, последние версии Python 3 также предоставляют python3 имя:

$ cat my_script.py
#!/usr/bin/env python3
import json
print("hello, json")
Ответ 4

Чтобы запустить скрипт на python, нам нужно сообщить оболочке три вещи:


  1. Что файл является скриптом

  2. Каким интерпретатором мы хотим выполнить скрипт

  3. Путь к указанному интерпретатору

Ошибка #! выполняется (1.). Ошибка начинается с # потому что # символ является маркером комментария во многих скриптовых языках. Таким образом, содержимое строки shebang автоматически игнорируется интерпретатором.

env Команда выполняет (2.) и (3.). Чтобы процитировать "серьезность",


Обычно команда 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.)


2023-08-18 20:33 python