Почему Python в Linux требует строку #! / Usr / bin / python?

Довольно простой вопрос: в Linux почему Python требует строку

#!/usr/bin/python

в начале файла python, так как Windows не работает?

Что это значит делать? потому что описание «Ссылки на Python» немного расплывчато ...

1
задан 11 November 2015 в 06:54

6 ответов

Вы указали указанную строку, чтобы сообщить компьютеру, какую программу / интерпретатор использовать при непосредственном запуске файла / скрипта, и любые аргументы, которые должны быть переданы этой программе при запуске скрипта. Это, однако, не требование Python, это требование ядра / системы linux, если вы намереваетесь напрямую запускать скрипт (а не передавать его на Python с помощью синтаксиса ниже).

не требуется, если вы собираетесь выполнять python script.py или аналогичные. Это необходимо, только если вы намереваетесь напрямую запускать скрипт / файл, не предоставляя также интерпретатору (например, python).

Для сценария Bash это будет иметь что-то вроде этого:

#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;

Это указывает на систему, которая при ее запуске должна запускаться через /bin/bash, которая является одним из языков shell / shell-script в системе .

Для кода Python, здесь, вы захотите, чтобы исполняемый файл выполнялся через Python, поэтому вы рассказываете, какой интерпретатор вы намереваетесь запустить в нем.

#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()

Это, как и для Bash, указывает, что следует использовать /usr/bin/python (это, вероятно, Python 2 или Python 3, в зависимости от ваших индивидуальных конфигураций системы).

Таким образом, вы можете запускать ./filename.py или ./executable или ./scripttorun напрямую.

Без этой строки в начале и при условии, что вы установили файл / script, чтобы быть исполняемым и предполагая, что вы работаете с скриптом Python, вам нужно будет запустить python filename.py или подобное, если у вас не было t он #!/usr/bin/python. (Для сценария Bash вам нужно будет делать bash script.sh или аналогично для других скриптов / языков, таких как Perl, Ruby и т. Д.)

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

41
ответ дан 23 May 2018 в 16:04
  • 1
    Интересным было бы добавить, что можно указать дополнительные параметры после самого shebang, в большинстве случаев так же, как если бы интерпретатор вызывался напрямую (#!/bin/bash -x, #!/usr/bin/perl -lan и т. Д.). – kos 5 November 2015 в 07:47
  • 2
    @kos: Я думаю, вы можете указать ровно один дополнительный аргумент, который был PITA, когда один (должен) использовать /usr/bin/env python для получения правильного питона. – progo 5 November 2015 в 12:50
  • 3
    @progo Не уверен, что проблема с env, но проблема кажется not числом аргументов: #!/usr/bin/perl -l -a -n имеет три аргумента, но это работает. Хотя опять-таки, я не в состоянии понять проблему. – kos 5 November 2015 в 14:28
  • 4
    При явном вызове интерпретатора со сценарием в качестве аргумента нет причин, чтобы последние начинались с ./. Другими словами, только python filename.py или bash script.sh будут работать нормально. Единственная причина включить ./ в имя команды, когда вы хотите сообщить оболочке не искать в $PATH (которая, вероятно, не найдет файлы в текущем каталоге), но возьмите путь, который вы указали как есть. Но это не относится к аргументам команды. – Marc van Leeuwen 5 November 2015 в 14:55
  • 5
    @kos: Проблема может заключаться в том, как env получает остальные аргументы из ядра. Все они могут считаться одним большим аргументом без выполнения расщепления по пространству. Извините за артикуляцию, я не помню подробностей этого, что хорошо – progo 5 November 2015 в 16:35

Линия:

#!/usr/bin/python

называется «shebang» и указывает путь к двоичному интерпретатору, который будет использоваться для интерпретации остальных команд в файле. Обычно это первая строка скрипта.

Таким образом, строка #!/usr/bin/python указывает, что содержимое файла будет интерпретировано двоичным файлом python, расположенным в /usr/bin/python.

Обратите внимание, что строка shebang анализируется на ядро, а затем скрипт будет в конечном итоге вызываться как аргумент:

python script_name

Аналогично в случае #!/bin/bash:

bash script_name
16
ответ дан 23 May 2018 в 16:04
  • 1
    Я не думаю, что когда-либо видел дефис в shebang. Поскольку слово сформировано из "хэш" и "bang", " ваше правописание не очень понятно, так как похоже, что это комбинация «она» и «bang». – Kyle Strand 6 November 2015 в 01:52
  • 2
    Вы можете называть его hashbang (# = "hash") или shebang (# = "sharp"), в зависимости от того, как вы называете символ #. Однако shebang действительно более распространен. @KyleStrand – Byte Commander 14 December 2015 в 20:15

Технически это не требует. Для этого требуется путь к среде, в которой выполняется ваш скрипт. Ваши будущие сценарии будут лучше включать / usr / bin / env, а затем указать python. Эти грантополучатели, что ваш скрипт работает в среде python независимо от того, где установлен python. Вы хотите сделать это по соображениям совместимости, вы не можете быть уверены, что следующий человек, которому вы делитесь своим кодом, будет иметь python, установленный в usr / bin / python, или что у них будут разрешения на эти системные файлы.

Вот аналогичный Q & amp; A из переполнения стека.

То, что выглядит в вашем скрипте:

#!/usr/bin/env python

Я также вижу некоторую озабоченность как указать python3. Вот как это сделать:

#!/usr/bin/env python3
7
ответ дан 23 May 2018 в 16:04

в Linux, Python могут или не могут требовать [ф10] линия (притон). Это зависит от того, как Питон коды обрабатываются, либо работает коды в интерактивном режиме Python или в скрипт Python.

интерактивный режим Python позволяет пользователю вводить и запускать Python-коды, которые не требуют линии притон. Для запуска в интерактивном режиме, откройте терминал и введите на [F11] для Python 2.X или [ф12] для Python 3.Х.

[Ф1]

в интерактивном режиме питона позволяет пользователям писать и сохранять на Python коды в текстовый файл, затем запустить позже коды. Это может или не может потребовать от линии притон. Однако, есть два известных причин, когда линия притон требуется для использования скрипта Python в Linux.

для запуска Python коды в исполняемый скрипт, т. е. определяет, как эти коды должны работать и через какой переводчик; для запуска Python кодов применительно к конкретной версии Python, т. е. работать коды, совместимые с питона 2.Х или Python 3.X только

практика с Python скрипты

ниже приведены список и содержимое файлов, которые я использовал, чтобы показать, что случаи [от f13] линия (притон) требуется или не требуется.

[Ф2] [ф14] содержится исходный код только. [Ф3] [ф15] содержит исходный код и линия притон. [Ф4] [ф16] содержит так же, как [f17 в] и сделать его исполняемым. [ф18] содержит так же, как [зг19], кроме того, адаптировано для работы с Python 3 путем переименования первой линии [20 фунтов]. [клавиши f21] содержит так же, как [ф22] и сделать его исполняемым. [ф23] содержит так же, как [ф24] и сделать его исполняемым, за исключением сохранен с опцией [f25 привод датчика] в текстовом редакторе, т. е. коврик.

после этого, пользователю будет представлен с двумя методами для запуска скриптов Python. Оба метода были продемонстрированы как ниже.

практика с Python скрипты

ниже перечислены команды и выход при работе исходный код с Python 2 и Python 3.

[ф5]

обе версии Python удалось успешно запустить скрипт. Следовательно, линия притон не требуется при запуск скрипта Python через [ф26] или команды python3.

способ 2: запуск скрипта Python

ниже перечислены команды и выход при работе исходный код с линией притон, которые адаптированы к ни, Python 2 и Python 3, в том числе и неисполняемые и исполняемые случаях.

[ф6]

первый скрипт уже не удалось, потому что эти сценарии не являются исполняемыми, независимо от наличия линии притон или нет (для обслуживания доказательство см. в способ 2: запуск скрипта Python ниже). Последние два скрипта есть строка притон и исполняемый.

судя по всему, сценарий, который был сделан исполняемым, в сущности, бесполезно без линии притон. Следовательно, нужны линии хижина и скрипт должен быть исполняемым при запуске кодов Python в исполняемый скрипт.

когда притон не работает

[и D40]в моем подготовлен и протестирован примеру, работа [ф28] как исполняемый скрипт не удалось, и возвращается сообщение об ошибке.[!и D40] [ф7] [dрайвер d41]это известное ограничение, что притон не работает или становится недействительным. Когда файл сохранен в кодировке Юникод спецификации (метка порядка байтов), он не сможет нормально запустить как исполняемый скрипт Python.[!dрайвер d41] [d43 см.]когда притон не работает[!d43 см.]

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

я создал еще один файл с названием hello1e.py, который содержит так же, как [f30 С] и сделать его исполняемым. Запустив этот скрипт вернул ошибку синтаксиса.

[ф8]

при запуске этого скрипта, во-первых, курсор мыши изменится на знак "плюс", а не по внешнему виду. Ошибки не будут показаны, пока я не сделал кнопкой мыши на рабочем столе или окне терминала. Затем этот скрипт создает файл [ф31] в том же каталоге, что и скрипт.

[F9] и

в [f32 из файла] был идентифицирован как PostScript-файл, без расширения файла. Этот файл может быть открыт в окне просмотра документа, т. е. выказывают, а файл на самом деле содержится скриншот окна, которое я щелкнул раньше. По моему опыту, файл может достигать нескольких мегабайт.

опять потребовалось линии хижина и скрипт должен быть исполняемым при запуске скрипта Python в исполняемый скрипт. В противном случае, скрипт будет безобразничать, как описано выше.

Примечания

термин "сделать исполняемым" или "должен быть исполняемый" ссылается на разрешение на запуск скрипта. Это делается путем выполнения команды chmod +x FILENAME в терминале, или включите опцию "разрешить этому файл для запуска программы" или что-то подобное в Примечания[!окна д51], в файловый менеджер.

[о d54]в то время как другие существующие ответы были охвачены практически все, этот ответ занял другой подход с использованием практических примеров, чтобы объяснить дело. Синтаксис кода были написаны с осторожностью, такой, что примеров может выполняться либо на Python 2 и Python 3, так как он.[!о d54]

Питон коды были адаптированы из известное ограничение и используя Python на платформах Unix, с дополнительными одну строку кода в строку "Здравствуй, мир!" программа.

все коды и команды были полностью протестированы и работает в системе xubuntu в 14.04, которая в Python 2.7 и Python 3.4 установлен по умолчанию.

5
ответ дан 23 May 2018 в 16:04

Это означает, что когда этот файл выполняется, ваш компьютер знает, как его выполнить с программой /usr/bin/python, так вы рассказываете об этом отдельно от другого языка, например bash, где вы будете делать #!/bin/bash. Это значит, что вы можете просто запустить:

./[file-to-execute]

И он будет знать, какой файл выполнить его, а не вы сами должны указать что-то вроде:

python ./[file-to-execute].py
[d2 ] [F5] часть обычно упоминается как shebang или crunch bang.

4
ответ дан 23 May 2018 в 16:04

Если у вас установлено несколько версий Python, /usr/bin/env гарантирует, что используемый интерпретатор является первым в вашей среде $PATH вашей среды. Альтернативой будет хард-код, например #!/usr/bin/python;

В Unix исполняемый файл, который должен интерпретироваться, может указывать, какой интерпретатор использовать, имея #! в начале первой строки, за которым следует интерпретатор (и любые флаги, которые могут понадобиться) .

Это правило применимо только для системы на базе UNIX.

1
ответ дан 23 May 2018 в 16:04

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

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