Заголовок сценарію Python


79

Типовий заголовок повинен бути

#!/usr/bin/env python

Але я знайшов нижче, також працює при виконанні сценарію типу $python ./my_script.py

#!/usr/bin/python
#!python

Яка різниця між цими 2 заголовками? Що може бути проблемою для другого? Будь ласка, також обговорюйте справу для інтерпретатора python у PATH чи ні. Дякую.


3
цей заголовок називається Shebang en.wikipedia.org/wiki/Shebang_%28Unix%29
systempuntoout

4
FYI, коли ви запускаєте сценарій способом $ python ./my_script.py( pythonявно вказавши ), #!рядок shebang ( ) ігнорується. Це впливає лише на те, що ви запускаєте сценарій як виконуваний файл, наприклад $ ./my_script.py.
David Z

@ Давид Заславський: +1 Хороший улов.
Марк Байерс,

Відповіді:


103

По-перше, щоразу, коли ви запускаєте сценарій, використовуючи інтерпретатор явно, як у

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

#!лінія завжди ігнорується. #!Лінія є особливістю Unix з виконуваних тільки скриптів, і ви можете побачити це документально в повному обсязі на сторінціexecve(2) керівництва . Там ви знайдете, що наступне слово #!має бути назвою шляху дійсного виконуваного файлу. Так

#!/usr/bin/env python

виконує все python, що стосується користувачів $PATH. Ця форма є стійкою до переміщення інтерпретатора Python, що робить його дещо більш портативним, але це також означає, що користувач може замінити стандартний інтерпретатор Python, поставивши щось перед ним $PATH. Залежно від ваших цілей, така поведінка може бути і не в порядку.

Далі,

#!/usr/bin/python

йдеться про поширений випадок, коли встановлено інтерпретатор Python /usr/bin. Якщо він встановлений де-небудь ще, ви програєте. Але це хороший спосіб забезпечити, щоб ви отримали саме ту версію, яку хочете, а то і зовсім нічого (поведінка "зупинка-зупинка"), як у

#!/usr/bin/python2.5

Нарешті,

#!python

працює лише за умови, що pythonу поточному каталозі під час запуску сценарію є виконуваний файл. Не рекомендовано.


28


На початку вашого сценарію я б запропонував 3 речі:

По-перше, як уже було сказано, використовуйте середовище:

#!/usr/bin/env python

По-друге, встановіть своє кодування:

# -*- coding: utf-8 -*-

По-третє, встановіть рядок документа:

"""This is a awesome
    python script!"""

І точно я б використовував " "(4 пробіли) для ідентифікатора.
Остаточний заголовок буде виглядати так:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


З найкращими побажаннями та щасливим кодуванням.


Тільки для підтримки начебто самовпевненого коментаря до пробілів над вкладками: "Пробіли - найкращий метод відступу". ( python.org/dev/peps/pep-0008/#tabs-or-spaces )
deepelement

5

Виконуваний файл Python може бути встановлений в іншому місці, ніж / usr / bin, але envмайже завжди присутній у цьому місці, тому використання /usr/bin/envє більш портативним.


2

Зі сторінки керівництва для env(GNU coreutils 6.10):

env - run a program in a modified environment

Теоретично ви можете використати envдля скидання середовища (видалення багатьох існуючих змінних середовища) або додавання додаткових змінних середовища в заголовок сценарію. Практично кажучи, дві згадані вами версії ідентичні. (Хоча інші згадали хороший момент: вказівка pythonчерез envдозволяє абстрактно вказати, pythonне знаючи його шляху.)


1

Так, є - python може бути не в /usr/bin, але, наприклад, у /usr/local/bin(BSD).

Використовуючи virtualenv, це може бути навіть щось на зразок ~/projects/env/bin/python


0

Це /usr/bin/env pythonстає дуже корисним, коли ваші сценарії залежать від налаштувань середовища, наприклад, використовуючи сценарії, на які покладаються python virtualenv. Кожен virtualenv має власну версію двійкового файлу python, який необхідний для додавання пакетів, встановлених у virtualenv, до шляху python (не торкаючись PYTHONPATH env).

Оскільки все більше і більше людей починають використовувати virtualenv для розробки python, воліють використовувати, /usr/bin/env pythonякщо ви не хочете, щоб люди використовували їхній власний двійковий файл python.

Примітка: Ви також повинні розуміти, що існують потенційні проблеми з безпекою (у багатокористувацьких середовищах), коли ви дозволяєте людям запускати ваші сценарії у своїх спеціальних середовищах. Деякі ідеї ви можете отримати тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.