webentwicklung-frage-antwort-db.com.de

Zweck von #!/Usr/bin/python3

Ich habe das in einigen Skriptsprachen bemerkt, aber in diesem Beispiel verwende ich Python. In vielen Tutorials würden sie mit #!/usr/bin/python3 in 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. Insbesondere wenn es keine vollständige Versionsnummer ist (wie Python3 vs Python32)

Wenn überhaupt, könnte ich das Python-Skript aus den oben genannten Gründen brechen sehen.

98
KayleL

#!/usr/bin/python3 ist eine Shebang-Linie .

Eine Shebang-Linie definiert, wo sich der Dolmetscher befindet. In diesem Fall befindet sich der python3-Interpreter in /usr/bin/python3. Eine Shebang-Zeile könnte auch eine bash, Ruby, Perl oder ein anderer Interpreter einer anderen Skriptsprache sein, zum Beispiel: #!/bin/bash

Ohne die Shebang-Zeile weiß das Betriebssystem nicht, dass es ein Python-Skript ist, auch wenn Sie das Ausführungsflag für das Skript setzen und es wie ./script.py ausführen. Um das Skript standardmäßig in python3 auszuführen, rufen Sie es entweder als python3 script.py auf oder setzen die Shebang-Linie.

Sie können #!/usr/bin/env python3 für die Portabilität auf verschiedenen Systemen verwenden, falls der Sprachinterpreter an verschiedenen Orten installiert ist.

160
Jin

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

Ein nicht auf Unix basierendes Betriebssystem verwendet seine eigenen Regeln, um herauszufinden, wie das Skript ausgeführt wird. Windows verwendet zum Beispiel die Dateinamenerweiterung und der # 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, Verknüpfungen zu der tatsächlichen ausführbaren Datei von jedem Ort aus zu erstellen, der von der Standardkonvention festgelegt wird.

16
Mark Ransom

Diese Zeile hilft bei der Suche der ausführbaren Programmdatei, mit der das Skript ausgeführt wird. Diese Shebang-Notation ist in den meisten Skriptsprachen ein gewisser Standard (zumindest wie in älteren Betriebssystemen verwendet).

Ein wichtiger Aspekt dieser Zeile ist die Angabe von , welcher Interpreter verwendet wird. Bei vielen entwicklungsorientierten Linux-Distributionen ist es zum Beispiel normal, mehrere Python-Versionen gleichzeitig zu installieren.

Python 2.x und Python 3 sind nicht zu 100% kompatibel, daher kann dieser Unterschied sehr wichtig sein. Daher sind #! /usr/bin/python und #! /usr/bin/python3 nicht identisch (und auch nicht ganz dasselbe wie #! /usr/bin/env python3 wie an anderer Stelle auf dieser Seite angegeben.

10
zxq9
  1. Und diese Zeile ist wie .

  2. Es wird ignoriert.

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

  4. Es wird nicht ausgeführt, und möglicherweise läuft es unter einer anderen Version trotzdem nicht.

Tatsächlich ist die Bestimmung, welche Art von Datei eine Datei ist, sehr kompliziert, so dass das Betriebssystem jetzt nicht mehr wissen kann. Es kann viele Vermutungen basierend auf -

  • erweiterung
  • UTI
  • MIME

Aber die Kommandozeile macht sich nicht die Mühe, weil sie auf einer begrenzten abwärtskompatiblen Schicht läuft, von der aus dieser schicke Unsinn nichts bedeutete. Wenn Sie sicher darauf doppelklicken, kann ein modernes Betriebssystem dies herausfinden - aber wenn Sie es von einem Terminal aus ausführen, dann nein, da das Terminal sich nicht für Ihre ausgefallenen OS-spezifischen APIs für die Dateitypisierung interessiert.

Zu den anderen Punkten. Es ist eine Bequemlichkeit, es ist ähnlich möglich zu laufen 

python3 path/to/your/script

Wenn sich Ihr Python nicht in dem angegebenen Pfad befindet, funktioniert er nicht, aber wir neigen dazu, Dinge zu installieren, damit solche Dinge funktionieren, nicht umgekehrt. Es ist eigentlich egal, ob Sie unter * nix sind, es liegt an Ihrer Shell, ob Sie diese Zeile berücksichtigen, da es sich um eine shellcode handelt. So können Sie beispielsweise bash unter Windows ausführen.

Sie können diese Zeile eigentlich ganz weglassen, es bedeutet nur, dass der Anrufer einen Interpreter angeben muss. Platzieren Sie Ihre Interpreter auch nicht an anderen Orten als dem Standard und versuchen Sie dann, Skripts ohne Interpreter aufzurufen.

0
awiebe

Um zu verdeutlichen, wie die Shebang-Linie für Windows funktioniert, verwenden Sie den Python-Befehl 3.7 doc :

  • Wenn die erste Zeile einer Skriptdatei mit #! Beginnt, spricht man von einer Shebang-Zeile. Linux und andere Unix-ähnliche Betriebssysteme unterstützen solche Zeilen systemeigen. Sie 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-Skripts unter Windows verwendet werden
  • Damit Shebang-Zeilen in Python-Skripts 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 spezielle Eigenschaft. Bevor Sie nach installierten Python-Interpreters suchen, durchsucht dieses Formular die ausführbare Datei PATH nach einer ausführbaren Python-Datei. Dies entspricht dem Verhalten des Unix-Programms env, das eine PFAD-Suche durchführt.
    • / usr/bin/python
    • / usr/local/bin/python
    • python
0
boardtc