Призначення #! / Usr / bin / python3


160

Я помітив це в декількох мовах сценаріїв, але в цьому прикладі я використовую python. У багатьох навчальних посібниках вони починатимуться з #!/usr/bin/python3першого рядка. Я не розумію, чому ми маємо це.

  • Чи не повинна операційна система знати, що це сценарій python (очевидно, він встановлений, оскільки ви робите посилання на нього)
  • Що робити, якщо користувач використовує операційну систему, яка не базується на Unix
  • Мова встановлена ​​в іншій папці з будь-якої причини
  • У користувача є інша версія. Особливо, коли це не повний номер версії (як Python3 проти Python32)

Якщо що, я міг бачити, як це порушує сценарій python через перераховані вище причини.



9
Я приходжу до цього питання лише для того, щоб скопіювати рядок shebang.
omerjerk

Відповіді:


260

#!/usr/bin/python3- лінія шебанг .

Рядок shebang визначає, де знаходиться перекладач. У цьому випадку python3перекладач знаходиться в /usr/bin/python3. Лінія A притон також може бути bash, ruby, perlперекладач або будь - яких інших мов сценаріїв, наприклад: #!/bin/bash.

Без рядка shebang, операційна система не знає, що це сценарій python, навіть якщо ви встановите прапор виконання на скрипті і виконайте його так ./script.py. Щоб сценарій запускався за замовчуванням у python3, або викликайте його як python3 script.pyабо встановіть рядок shebang.

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


8
Тож #! /usr/bin/env python3слід вибирати понад #! /usr/bin/python3?
winklerrr

4
@winklerrr Так, він широко використовується.
MerreM

20

Це називається хеш-чум. Якщо ви запустите скрипт із оболонки, він перевіряє перший рядок, щоб визначити, яку програму слід почати інтерпретувати скрипт.

Операційна система, що не базується на Unix, використовуватиме свої власні правила для з'ясування способів запуску сценарію. Наприклад, Windows використовуватиме розширення імені файлу, і цей параметр #спричинить розгляд першого рядка як коментаря.

Якщо шлях до виконуваного файлу Python невірний, сценарій, природно, не вдасться. Легко створювати посилання на фактичний виконуваний файл з будь-якого місця, визначеного стандартною умовою.


12

Цей рядок допомагає знайти виконувану програму, яка запустить сценарій. Ця позначення shebang є досить стандартною для більшості мов сценаріїв (принаймні, як це використовується у дорослих операційних системах).

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

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


6
  1. І ця лінія - як .

  2. Це ігнорується.

  3. Він не запуститься, і його слід змінити, щоб вказати на потрібне місце. Або envслід використовувати.

  4. Він не запуститься і, ймовірно, не запуститься в іншій версії незалежно.


3

Щоб уточнити, як працює лінія shebang для Windows, з документа 3.7 Python :

  • Якщо перший рядок файлу сценарію починається з #!, Він відомий як "shebang". Linux та інші подібні операційні системи Unix мають вбудовану підтримку таких ліній, і вони зазвичай використовуються в таких системах для вказівки, як слід виконувати сценарій.
  • Запуск програми Python для Windows дозволяє використовувати ті самі засоби, що і сценарії Python для Windows
  • Щоб рядки shebang в сценаріях Python могли переноситися між Unix та Windows, запускаючий апарат підтримує ряд команд "віртуальні", щоб вказати, який інтерпретатор використовувати. Підтримувані віртуальні команди:
    • / usr / bin / env python
      • Форма / usr / bin / env лінії shebang має ще одну особливу властивість. Перш ніж шукати встановлені інтерпретатори Python, у цій формі буде здійснено пошук у виконаному PATH виконаному файлі Python. Це відповідає поведінці програми Unix env, яка здійснює пошук PATH.
    • / usr / bin / python
    • / usr / local / bin / python
    • пітон

2

Власне визначення типу файлу файлу дуже складне, тому тепер операційна система не може просто знати. Це може зробити багато здогадок на основі -

  • розширення
  • UTI
  • MIME

Але командний рядок не турбується з усім цим, оскільки він працює на обмеженому назад сумісному шарі, з тих пір, коли ця химерна дурниця нічого не означала. Якщо ви двічі клацніть по цьому точно, сучасна ОС може це зрозуміти, але якщо ви запускаєте її з терміналу, то ні, оскільки термінал не піклується про ваші фантазійні файли API для введення файлів.

Щодо інших моментів. Це зручність, аналогічно можна бігати

python3 path/to/your/script

Якщо ваш пітон не вказаний шлях, він не працюватиме, але ми схильні встановлювати такі речі, щоб зробити такі речі, як ця робота, а не навпаки. Насправді не має значення, якщо ви знаходитесь під * nix, від вашої оболонки залежить, чи вважати цю лінію, тому що це a shellcode. Так, наприклад, ви можете працювати bashпід Windows.

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

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