Zweck von #! / Usr / bin / python3

160

Ich habe dies in einigen Skriptsprachen bemerkt, aber in diesem Beispiel verwende ich Python. In vielen Tutorials würden sie #!/usr/bin/python3in der ersten Zeile beginnen. Ich verstehe nicht, warum wir das haben.

  • Sollte das Betriebssystem nicht wissen, dass es sich um ein Python-Skript handelt (offensichtlich ist es installiert, da Sie darauf verweisen)?
  • Was ist, wenn der Benutzer ein Betriebssystem verwendet, das nicht auf Unix basiert?
  • Die Sprache wird aus irgendeinem Grund in einem anderen Ordner installiert
  • Der Benutzer hat eine andere Version. Besonders wenn es keine Vollversionsnummer ist (wie Python3 vs Python32)

Wenn überhaupt, konnte ich sehen, dass dies das Python-Skript aus den oben aufgeführten Gründen brach.

KayleL
quelle
stackoverflow.com/questions/2429511/…
Ciro Santilli 2 冠状 冠状. 六四 事件 2.
9
Ich komme zu dieser Frage, nur um die Shebang-Saite zu kopieren.
Omerjerk

Antworten:

260

#!/usr/bin/python3ist eine Shebang-Linie .

Eine Shebang-Linie definiert, wo sich der Interpreter befindet. In diesem Fall befindet sich der python3Interpreter in /usr/bin/python3. Eine shebang Linie könnte auch ein sein bash, ruby, perloder jede andere Skriptsprachen Dolmetscher, zum Beispiel: #!/bin/bash.

Ohne die Shebang-Zeile weiß das Betriebssystem nicht, dass es sich um ein Python-Skript handelt, selbst wenn Sie das Ausführungsflag für das Skript setzen und es wie folgt ausführen ./script.py. Um das Skript standardmäßig in Python3 auszuführen, rufen Sie es entweder als auf python3 script.pyoder legen Sie die Shebang-Zeile fest.

Sie können die #!/usr/bin/env python3Portabilität zwischen verschiedenen Systemen verwenden, falls der Sprachinterpreter an verschiedenen Standorten installiert ist.

Jin
quelle
8
Also #! /usr/bin/env python3sollte über gewählt werden #! /usr/bin/python3?
Winklerrr
3
@winklerrr Ja, es wird häufiger verwendet.
MerreM
20

Das nennt man einen Hash-Bang. Wenn Sie das Skript über die Shell ausführen, wird die erste Zeile überprüft, um herauszufinden, welches Programm zur Interpretation des Skripts gestartet werden sollte.

Ein nicht auf Unix basierendes Betriebssystem verwendet seine eigenen Regeln, um herauszufinden, wie das Skript ausgeführt wird. Windows verwendet beispielsweise die Dateinamenerweiterung und #bewirkt, dass die erste Zeile als Kommentar behandelt wird.

Wenn der Pfad zur ausführbaren Python-Datei falsch ist, schlägt das Skript natürlich fehl. Es ist einfach, Links zur tatsächlichen ausführbaren Datei von jedem Ort aus zu erstellen, der in der Standardkonvention angegeben ist.

Mark Ransom
quelle
12

Diese Zeile hilft bei der Suche nach der ausführbaren Programmdatei, mit der das Skript ausgeführt wird. Diese Shebang-Notation ist in den meisten Skriptsprachen ziemlich Standard (zumindest wie sie auf erwachsenen Betriebssystemen verwendet wird).

Ein wichtiger Aspekt dieser Zeile ist die Angabe, welcher Interpreter verwendet wird. Bei vielen entwicklungsorientierten Linux-Distributionen ist es beispielsweise normal, dass mehrere Python-Versionen gleichzeitig installiert sind.

Python 2.x und Python 3 sind nicht 100% kompatibel, daher kann dieser Unterschied sehr wichtig sein. Also #! /usr/bin/pythonund #! /usr/bin/python3sind nicht die gleichen (und auch nicht ganz die gleichen #! /usr/bin/env python3wie an anderer Stelle auf dieser Seite angegeben.

zxq9
quelle
6
  1. Und diese Linie ist wie .

  2. Es wird ignoriert.

  3. Es kann nicht ausgeführt werden und sollte so geändert werden, dass es auf den richtigen Speicherort verweist. Oder envsollte verwendet werden.

  4. Es kann nicht ausgeführt werden und wird wahrscheinlich trotzdem nicht unter einer anderen Version ausgeführt.

Ignacio Vazquez-Abrams
quelle
3

Um zu verdeutlichen, wie die Shebang-Zeile für Windows funktioniert, lesen Sie das 3.7 Python-Dokument :

  • Wenn die erste Zeile einer Skriptdatei mit #! Beginnt, wird dies als "shebang" -Zeile bezeichnet. Linux und andere Unix-ähnliche Betriebssysteme unterstützen solche Zeilen nativ und werden häufig auf solchen Systemen verwendet, um anzugeben, wie ein Skript ausgeführt werden soll.
  • Mit dem Python Launcher für Windows können dieselben Funktionen mit Python-Skripten unter Windows verwendet werden
  • Damit Shebang-Zeilen in Python-Skripten zwischen Unix und Windows portiert werden können, unterstützt der Launcher eine Reihe von 'virtuellen' Befehlen, um anzugeben, welcher Interpreter verwendet werden soll. Die unterstützten virtuellen Befehle sind:
    • / usr / bin / env python
      • Die / usr / bin / env-Form der Shebang-Linie hat eine weitere besondere Eigenschaft. Bevor Sie nach installierten Python-Interpreten suchen, durchsucht dieses Formular den ausführbaren Pfad nach einer ausführbaren Python-Datei. Dies entspricht dem Verhalten des Unix-env-Programms, das eine PATH-Suche durchführt.
    • / usr / bin / python
    • / usr / local / bin / python
    • Python
boardtc
quelle
2

Tatsächlich ist die Bestimmung des Dateityps einer Datei sehr kompliziert, sodass das Betriebssystem dies jetzt nicht nur wissen kann. Es kann viele Vermutungen anstellen, basierend auf -

  • Erweiterung
  • UTI
  • MIME

Aber die Kommandozeile kümmert sich nicht darum, weil sie auf einer begrenzten abwärtskompatiblen Ebene läuft, ab wann dieser ausgefallene Unsinn nichts mehr bedeutete. Wenn Sie sicher darauf doppelklicken, kann ein modernes Betriebssystem dies herausfinden. Wenn Sie es jedoch von einem Terminal aus ausführen, ist dies nicht der Fall, da sich das Terminal nicht um Ihre ausgefallenen betriebssystemspezifischen APIs zur Dateitypisierung kümmert.

In Bezug auf die anderen Punkte. Es ist eine Annehmlichkeit, es ist ähnlich möglich zu laufen

python3 path/to/your/script

Wenn sich Ihre Python nicht im angegebenen Pfad befindet, funktioniert sie nicht, aber wir neigen dazu, Dinge zu installieren, damit solche Dinge funktionieren, und nicht umgekehrt. Es spielt eigentlich keine Rolle, ob Sie unter * nix sind, es liegt an Ihrer Shell, ob Sie diese Zeile in Betracht ziehen, weil es eine ist shellcode. So können Sie beispielsweise bashunter Windows ausführen .

Sie können diese Zeile tatsächlich ganz weglassen. Dies bedeutet lediglich, dass der Anrufer einen Interpreter angeben muss. Stellen Sie Ihre Dolmetscher auch nicht an nicht standardmäßigen Orten auf und versuchen Sie dann, Skripte ohne Angabe eines Dolmetschers aufzurufen.

awiebe
quelle