В Linux Python може або не вимагає #!
рядка (shebang). Це залежить від того, як обробляються коди Python, або виконуючи коди в інтерактивному режимі Python, або в сценарії Python.
Інтерактивний режим Python дозволяє користувачеві безпосередньо вводити та запускати коди Python, що не вимагає лінії shebang. Щоб запустити інтерактивний режим, відкрийте термінал і наберіть python
для Python 2.X або python3
для Python 3.X.
$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Сценарій Python дозволяє користувачеві писати та зберігати коди Python у простому текстовому файлі, а потім запускати коди пізніше. Це може вимагати або не вимагати лінії шебанга. Однак є дві відомі причини, коли для використання сценарію Python в Linux потрібна лінія shebang.
запускати Python-коди у виконавчому скрипті, тобто визначає, як коди повинні бути запущені та використовуючи інтерпретатор;
запускати коди Python стосовно певної версії Python, тобто виконувати коди, сумісні з Python 2.X або Python 3.X
Попрактикуйтесь із сценаріями Python
Нижче наведено список та вміст файлів, за допомогою яких я показував випадки, що #!
(shebang) рядок потрібен чи не потрібен.
$ ls -ln *.py
-rw-rw-r-- 1 1000 1000 94 Dec 14 18:37 hello1.py
-rwxrwxr-x 1 1000 1000 116 Dec 14 18:37 hello2e.py
-rw-rw-r-- 1 1000 1000 116 Dec 14 18:37 hello2.py
-rwxrwxr-x 1 1000 1000 117 Dec 14 18:37 hello3e.py
-rwxrwxr-x 1 1000 1000 120 Dec 14 18:37 hello3m.py
-rw-rw-r-- 1 1000 1000 117 Dec 14 18:37 hello3.py
$ file *.py
hello1.py: ASCII text
hello2e.py: Python script, ASCII text executable
hello2.py: Python script, ASCII text executable
hello3e.py: Python script, ASCII text executable
hello3m.py: Python script, UTF-8 Unicode (with BOM) text executable
hello3.py: Python script, ASCII text executable
hello1.py
містить лише вихідний код.
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2.py
містить вихідний код і рядок shebang.
#!/usr/bin/env python
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2e.py
містить те саме, що hello2.py
і виконано.
hello3.py
містить те ж, що hello2.py
, за винятком того, що він адаптований для запуску з Python 3 шляхом перейменування першого рядка в #!/usr/bin/env python3
.
hello3e.py
містить те саме, що hello3.py
і виконано.
hello3m.py
містить те саме, що hello3.py
і зроблено виконуваним, за винятком збереженого з Write Unicode BOM
опцією в текстовому редакторі, тобто на панелі миші.
Крім цього, користувачеві буде представлено два способи запуску сценаріїв Python. Обидва методи були продемонстровані, як показано нижче.
Спосіб 1: Запустіть програму Python
Нижче наведені команди та висновки під час запуску вихідного коду з Python 2 та Python 3.
$ python hello1.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2]
Hello, World!
$ python3 hello1.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4]
Hello, World!
Обидві версії Python змогли запустити сценарій успішно. Отже, рядок shebang не потрібен під час запуску сценарію Python через python
або python3
команду.
Спосіб 2: Запустити як скрипт Python
Нижче наведені команди та вихідні дані при запуску вихідного коду з рядком shebang, пристосованим ні до Python 2, ні до Python 3, включаючи невиконані та виконувані регістри.
$ ./hello1.py
bash: ./hello1.py: Permission denied
$ ./hello2.py
bash: ./hello2.py: Permission denied
$ ./hello3.py
bash: ./hello3.py: Permission denied
$ ./hello2e.py
Hello from Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2]
Hello, World!
$ ./hello3e.py
Hello from Python 3.4.3 (default, Oct 14 2015, 20:33:09)
[GCC 4.8.4]
Hello, World!
Перші три сценарії вийшли з ладу, оскільки ці сценарії не виконуються, незалежно від того, чи має рядок shebang чи ні (Про підтримку підтвердження див. Додатковий приклад нижче). Останні два сценарії мають рядок shebang і є виконуваним.
Мабуть, сценарій, який був виконаний виконуваним, по суті є марним без рядка shebang. Отже, рядок shebang необхідний, і сценарій повинен бути виконаним під час запуску кодів Python у виконаному сценарії.
Коли шебанг не працює
У моєму підготовленому і перевіреному прикладі, запуск hello3m.py
виконуваного сценарію не вдалося і повернув помилку.
$ ./hello3m.py
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory
Це відоме обмеження, що шибанг не працює або стає недійсним. Коли файл зберігається як Unicode BOM (Byte Order Mark), він не буде працювати нормально як виконуваний скрипт Python.
Додатковий приклад
Цей додатковий приклад розглядається лише як підтверджуючий доказ. Користувач повинен уникати запуску цього прикладу, хоча результат нешкідливий.
Я створив ще один файл під назвою hello1e.py
, який містить те саме, що hello1.py
і зроблений виконуваним. Запуск цього сценарію повернув синтаксичну помилку.
$ ./hello1e.py
./hello1e.py: line 2: syntax error near unexpected token `"Hello from Python %s\n"'
./hello1e.py: line 2: `sys.stdout.write("Hello from Python %s\n" % (sys.version,))'
Під час запуску цього сценарію спочатку курсор миші буде змінено на знак плюс і нічого не робить на вигляд. Помилка синтаксису не відображатиметься, поки я не натисну на вікно робочого столу чи терміналу. Потім цей скрипт створить sys
файл у тому ж каталозі, що і сценарій.
$ file sys
sys: PostScript document text conforming DSC level 3.0, Level 1
sys
Файл був ідентифікований як файл PostScript, без розширення файлу. Цей файл можна відкрити в засобі перегляду документів, тобто Evince, і файл фактично містив скріншот вікна, яке я натискав раніше. На мій досвід, файл може бути розміром декількох мегабайт.
Знову потрібен рядок shebang, і сценарій повинен бути виконаним під час запуску сценарію Python як виконуваного сценарію. Інакше сценарій не буде поводитись так, як описано вище.
Додаткові нотатки
Термін "зроблено виконуваним" або "повинен бути виконаним" відноситься до дозволу на запуск сценарію. Це робиться, запустивши chmod +x FILENAME
команду в Терміналі, або встановивши прапорець "Дозволити цей файл запускатися як програма" або щось подібне у вікні " Властивості" , в файловому менеджері.
Хоча інші існуючі відповіді охоплювали майже все, ця відповідь застосовувала інший підхід, використовуючи практичні приклади для пояснення питання. Синтаксис коду був написаний обережно, таким чином, щоб приклади могли бути запущені або з Python 2, або з Python 3, як є.
Коди Python були адаптовані за допомогою використання Python у Windows та використання Python на платформах Unix , з додатковим однорядним кодом всюдисущого "Привіт, світ!" програма.
Всі коди та команди були повністю перевірені і працюють у системі Xubuntu 14.04, в якій за замовчуванням встановлені Python 2.7 та Python 3.4.
.
), щоб визначити, що це за файл. Навіть Windows відходить від цього: вивчіть перші кілька рядків файлу Microsoft Word, і він констатує, що це насправді файл Microsoft Word.