Warum benötigt Python unter Linux die Zeile #! / Usr / bin / python?

50

Ziemlich einfache Frage: Warum benötigt Python unter Linux die Leitung?

#!/usr/bin/python

am Anfang einer Python-Datei, da Windows nicht?

Was tut es? Denn die Beschreibung "Links to Python" ist etwas vage ...

Sag mir warum
quelle
28
Die folgenden Antworten sind alle richtig, keine davon spricht an, warum Windows diese Zeile nicht benötigt. Windows hängt von der Dateierweiterung (dem Teil nach dem .) ab, um zu bestimmen, um welche Art von Datei es sich handelt. Auch Windows geht davon weg: Untersuchen Sie die ersten Zeilen der Microsoft Word-Datei, und es wird darauf hingewiesen, dass es sich tatsächlich um eine Microsoft Word-Datei handelt.
Charles Green
9
Der Elefant im Raum ist, dass Sie / usr / bin / python NIEMALS verwenden sollten, es sei denn, Sie sind mit Python 2 und 3 kompatibel.
Noch ein Benutzer
5
Es wird impliziert, aber in den Antworten unten nicht explizit angegeben, dass es nicht erforderlich ist . Es ist erforderlich, wenn Sie das Skript nur von seinem eigenen Namen ausführen möchten. Sie können python myscript.pystattdessen immer laufen .
Chris H
3
@CharlesGreen wir sollen nicht wissen warum windows nicht ;-) Das liegt an SO.
Rinzwind
2
@YetAnotherUser Seit der Veröffentlichung von Python 3 sind bereits sechs Jahre und elf Monate vergangen. Ich bin der Meinung, dass es besser ist, standardmäßig 3 zu verwenden und bei Bedarf explizit die Verwendung von 2 anzugeben.
JAB

Antworten:

58

Python stellt unter Linux keine besonderen Anforderungen. Es ist der Programmlader unter Unix / Linux, der die sogenannte "shebang" -Linie verwendet. Dies ist eigentlich eher eine Funktion als eine Einschränkung, aber wir werden gleich darauf zurückkommen. Die Wiki-Seite zu "shebang" enthält weitere Details, aber ich werde hier versuchen, einen Überblick sowie einen Vergleich zu Windows zu geben.

Schauen wir uns zunächst die Situation unter Windows an:

  • Wenn Sie versuchen, eine Datei zu öffnen oder auszuführen, überprüft Windows zunächst die Erweiterung dieser Datei. Dies ist der letzte Teil des Dateinamens, der mit beginnt. .Bei Python-Dateien ist dies normalerweise der Fall .py.
  • Windows ermittelt anhand der Dateierweiterung, welche Aktion ausgeführt werden soll.
    • Diese Informationen werden in der Windows-Registrierung gespeichert. Bei der Installation von Python wird Windows normalerweise mitgeteilt, dass .pyDateien mit der neu installierten Anwendung Python (dh dem Python-Interpreter) geöffnet werden sollen .
    • Einige Dateitypen haben ein eingebautes Verhalten. Beispielsweise müssen ausführbare Dateien (wie der Python-Interpreter selbst) auf enden .exe, und .batDateien werden als Windows-Batch-Skripte ausgeführt.
    • Die für einen bestimmten Dateityp ausgeführte Aktion kann angepasst werden . Sie können Windows beispielsweise mitteilen, dass .pyDateien nicht mithilfe von ausgeführt werden python.exe, sondern mit einem anderen Programm, z. B. dem Texteditor, geöffnet werden sollen notepad.exe.
      • In diesem Fall müssten Sie zum Ausführen eines Python-Skripts manuell aufrufen python <scriptname>.py(oder eine .batDatei schreiben , um dies für Sie zu tun).

Was passiert nun, wenn oben im Python-Skript eine Shebang-Zeile ( #!/usr/bin/pythonoder #!/usr/bin/env python) steht? Nun, da #es sich bei Python um eine Kommentarzeile handelt, ignoriert der Python-Interpreter sie einfach. Dies ist ein Grund, warum die meisten Skriptsprachen, die in der Unix / Linux-Welt verwendet werden #, Kommentarzeilen beginnen.

Es ist also etwas irreführend zu sagen, dass Windows die #!Leitung nicht benötigt . Windows nicht sehen die #!Linie, und in der Tat stützt sich auf die Datei-Erweiterung , es zu sagen , was zu tun ist . Dies hat einige Nachteile:

  • Sie müssen Python-Skripte mit .pyam Ende benennen , damit sie automatisch als solche erkannt werden.
  • Es gibt keine einfache Möglichkeit, Python2-Skripte von Python3-Skripten zu unterscheiden.
  • Wie bereits erwähnt, .pyführt Windows diese Skripts nicht mehr automatisch mit Python aus , wenn Sie das Standardstartverhalten für den Dateityp ändern . Beachten Sie, dass dies unbeabsichtigt geschehen kann.

Schauen wir uns nun an, wie Unix / Linux Skripte startet:

Das erste, was zu beachten ist, ist, dass Unix / Linux im Gegensatz zu Windows nicht versucht, Python-Skripte zumindest konzeptionell mit einem bestimmten Programm zu öffnen. Das Betriebssystem weiß, dass das Skript ausgeführt werden kann, weil es als "Ausführungsbit" bezeichnet wird (was außerhalb des Bereichs dieser Antwort liegt). Wenn Sie also versehentlich #!/usr/bin/pthonanstelle von #!/usr/bin/pythoneingeben, wird eine Fehlermeldung mit folgendem Text angezeigt:

/usr/bin/pthon: bad interpreter: No such file or directory.

Das Wort "Interpreter" gibt uns einen Hinweis auf die Rolle der Shebang-Zeile (obwohl das angegebene Programm technisch gesehen etwas anderes sein kann als ein Interpreter wie catein Texteditor). Wenn Sie versuchen, eine Datei auszuführen, geschieht Folgendes:

  • Der Unix / Linux-Programmlader überprüft die ersten beiden Bytes dieser Datei. Wenn dies zwei Bytes sind #!, interpretiert der Loader den Rest der Shebang-Zeile (mit Ausnahme des Shebang selbst) als Befehl zum Starten eines Interpreters, mit dem der Dateiinhalt als Skript ausgeführt werden kann.
  • Der Programmlader startet den angegebenen Interpreter und gibt ihm den Pfad der Originaldatei als Argument.

Das hat einige Vorteile:

  • Der Drehbuchautor hat mehr Kontrolle darüber, welcher Interpreter verwendet wird (wodurch das Python2 / Python3-Problem behoben wird) und kann dem Interpreter manchmal ein zusätzliches Argument übergeben (Einzelheiten finden Sie auf der Wiki-Seite).
  • Der Dateiname des Skripts wird ignoriert , sodass Sie Python-Skripte beliebig benennen können.

Beachten Sie schließlich, dass Unix / Linux die shebang-Zeile nicht benötigt , um ein Python-Skript auszuführen. Erinnern Sie sich, dass alles, was die Shebang-Zeile tatsächlich tut, es dem Programmlader ermöglicht , einen Interpreter auszuwählen . Aber genau wie in Windows kann dies manuell erfolgen:

python <myscript>
Kyle Strand
quelle
1
Unter Windows können Sie leicht haben .py2und .py3Erweiterungen für Python 2 / Python 3 - Skripten. Daher benötigen sowohl Linux (+ x Bit) als auch Windows (Dateierweiterung) Metadaten im Dateisystem. Der Hauptunterschied besteht darin, dass das + x-Bit während der Übertragung leichter verloren geht. Dies ist nicht unbedingt ein Nachteil.
MSalters
1
@MSalters Das Ausführungsbit enthält auch viel weniger Informationen. Beachten Sie auch, dass Sie möglicherweise mehrere Python2-Interpreter auf einem bestimmten System haben (bei Ruby und anderen Sprachen war dies bei früheren Aufträgen der Fall). Dies über die Shebang-Leitung zu erledigen ist nahezu trivial, während die Situation unter Windows umso weniger nachvollziehbar wird, je mehr Sie versuchen, mehrere ähnliche Dateitypen zu verwalten.
Kyle Strand
Zählt die Erweiterung auch wirklich als "Metadaten"? Es ist nur ein Teil des Dateinamens.
Kyle Strand
1
Die Metadaten einer Datei umfassen den gesamten Dateinamen, die Erstellungszeit, die Zugriffsbits usw. Nur der Inhalt selbst besteht aus Daten anstelle von Metadaten. Was die "Mehrfachdolmetscher" betrifft, so ist das in der Tat ein echtes Problem und genau deshalb sollte es nicht in der Shebang-Linie stehen. Was ist, wenn Sie /usr/bin/i686/pythonund haben /usr/bin/amd64/python? Völlig vernünftig, aber es bricht Python-Skripte, die eine hartkodierte Annahme haben /usr/bin/python. Die Wahl des Interpreters ist nicht eine Wahl des Drehbuchautors, sondern des Skriptbenutzers. Der Drehbuchautor darf nur die Sprache (Dialekt) auswählen.
MSalters
1
@MSalters Nun, das ist, was /usr/bin/envist, zusammen mit Env-Setup-Skripten. Was ist die Windows-Version davon? Ausführen eines regeditSkripts direkt vor dem Starten einer .pyDatei, um sicherzustellen, dass Sie den gewünschten Interpreter erhalten?
Kyle Strand
41

Die von Ihnen angegebene Zeile teilt dem Computer mit, welches Programm / welcher Interpreter verwendet werden soll, wenn die Datei / das Skript direkt ausgeführt wird, sowie alle Argumente, die bei Ausführung des Skripts an dieses Programm übergeben werden sollen. Dies ist jedoch keine Voraussetzung für Python , sondern eine Voraussetzung für den Linux-Kernel / das Linux-System, wenn Sie beabsichtigen, das Skript direkt auszuführen (und es nicht nach der folgenden Syntax an Python weiterzuleiten).

Es wird nicht benötigt, wenn Sie python script.pyoder ähnliches ausführen wollen . Es wird nur benötigt, wenn Sie beabsichtigen, das Skript / die Datei direkt auszuführen, ohne auch den zu verwendenden Interpreter bereitzustellen (z. B. python).


Für ein Bash-Skript würde es ungefähr so ​​aussehen:

#!/bin/bash [optional Bash arguments]
# Bash script code here
...
exit 0;

Dies würde dem System anzeigen, dass, wenn dies ausgeführt wird, ausgeführt werden soll, über /bin/bashwelche der Shells / Shell-Skriptsprachen auf dem System.


Für Python-Code möchten Sie jedoch, dass die ausführbare Datei über Python ausgeführt wird, und geben an, welchen Interpreter Sie ausführen möchten.

#!/usr/bin/python [optional Python arguments]
# Python code here
...
exit()

Dies gibt, wie bei Bash, an, dass /usr/bin/pythones verwendet werden sollte (dies ist wahrscheinlich Python 2 oder Python 3, abhängig von Ihren individuellen Systemkonfigurationen).


Auf diese Weise können Sie ./filename.pyoder ./executableoder ./scripttorundirekt ausführen .

Ohne diese Zeile am Anfang und unter der Annahme, dass die Datei / das Skript ausführbar ist und dass Sie mit einem Python-Skript arbeiten, müssten Sie sie ausführen python filename.pyoder Ähnliches, wenn Sie die #!/usr/bin/pythonZeile nicht hätten . (Für ein Bash-Skript müssten Sie dies tun bash script.shoder Ähnliches für andere Skripte / Sprachen, wie Perl, Ruby usw.)

Die Syntaxhervorhebung oben ist in jedem Abschnitt sprachspezifisch, obwohl dies eigentlich keine Rolle spielt.

Thomas Ward
quelle
1
Eine interessante Sache hinzuzufügen wäre, dass es möglich ist , sich zusätzliche Parameter nach dem shebang zu spezifizieren, in den meisten Fällen auf die gleiche Art und Weise , als ob der Interpreter aufgerufen wurde direkt ( #!/bin/bash -x, #!/usr/bin/perl -lanusw.).
Kos
7
@kos: Ich denke, Sie können genau ein zusätzliches Argument angeben, das ein PITA war, wenn man (sollte) /usr/bin/env python, um die richtige Python zu erhalten.
unperson325680
@progo Ich bin mir nicht sicher, woran es envliegt, aber das Problem scheint nicht die Anzahl der Argumente zu sein: Hat #!/usr/bin/perl -l -a -ndrei Argumente, funktioniert aber. Allerdings kann ich das genaue Problem nicht klären.
Kos
Wenn explizit ein Interpreter mit dem Skript als Argument aufgerufen wird, gibt es keinen Grund, letzteres zu beginnen ./. Mit anderen Worten, einfach python filename.pyoder bash script.shwird gut funktionieren. Der einzige Grund für das Einfügen ./ist ein Befehlsname, wenn Sie der Shell mitteilen möchten, dass sie nicht nach $PATHDateien im aktuellen Verzeichnis suchen soll, sondern den angegebenen Pfad verwenden soll. Dies gilt jedoch nicht für Befehlsargumente.
Marc van Leeuwen
@kos: Das Problem könnte darin liegen, wie envder Kernel die restlichen Argumente erhält. Man könnte davon ausgehen, dass es sich bei allen um ein einziges großes Argument handelt, bei dem keine Aufteilung nach Raum erfolgt. Entschuldigung für die Artikulation, ich kann mich nicht mehr so ​​gut an die Details erinnern
unperson325680
16

Die Linie:

#!/usr/bin/python

wird 'shebang' genannt und gibt den Pfad zur Interpreter-Binärdatei an, die zur Interpretation der übrigen Befehle in der Datei verwendet wird. Es ist normalerweise die erste Zeile eines Skripts.

Die Zeile #!/usr/bin/pythonzeigt also an, dass der Inhalt der Datei von der pythonBinärdatei interpretiert wird, die sich in befindet /usr/bin/python.

Beachten Sie, dass die shebang-Zeile vom Kernel analysiert wird und das Skript schließlich als Argument aufgerufen wird:

python script_name

Ebenso bei #!/bin/bash:

bash script_name
heemayl
quelle
2
Ich glaube nicht, dass ich jemals einen Bindestrich gesehen habe shebang. Da das Wort aus "Haschisch" und "Knall" gebildet wird, ist Ihre Rechtschreibung nicht sehr klar, da es so aussieht, als wäre es eine Kombination aus "Sie" und "Knall".
Kyle Strand
Sie können es hashbang( #= "Raute") oder shebang( #= "Scharf") nennen, je nachdem, wie Sie den #Charakter benennen . Ist shebangaber in der Tat häufiger. @KyleStrand
Byte Commander
7

Technisch ist es nicht erforderlich. Es erfordert einen Pfad zu der Umgebung, in der Ihr Skript ausgeführt wird. Ihre zukünftigen Skripte sollten / usr / bin / env einschließen und dann python angeben. Dies garantiert, dass Ihr Skript in der Python-Umgebung ausgeführt wird, unabhängig davon, wo Python installiert ist. Wenn Sie dies aus Kompatibilitätsgründen tun möchten, können Sie nicht sicher sein, ob auf der nächsten Person, für die Sie Ihren Code freigeben, Python in "usr / bin / python" installiert ist oder ob sie Berechtigungen für diese Systemdateien besitzt.

Hier ist eine ähnliche Frage und Antwort zum Stapelüberlauf .

Wie das in Ihrem Skript aussieht, ist:

#!/usr/bin/env python

Ich sehe auch Bedenken, wie man python3 spezifiziert. So geht's:

#!/usr/bin/env python3
j0h
quelle
5

Unter Linux erfordert Python möglicherweise die #!(shebang) -Zeile. Dies hängt davon ab, wie mit den Python-Codes umgegangen wird. Entweder werden die Codes im interaktiven Python-Modus oder in einem Python-Skript ausgeführt.

Der interaktive Python-Modus ermöglicht es dem Benutzer, Python-Codes direkt einzugeben und auszuführen, ohne dass die Shebang-Linie erforderlich ist. Um den interaktiven Modus auszuführen, öffnen Sie ein Terminal und geben Sie pythonfür Python 2.X oder python3Python 3.X ein.

$  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.
>>>

Mit dem Python-Skript kann der Benutzer die Python-Codes in einer Nur-Text-Datei schreiben und speichern und sie später ausführen. Dies kann die Shebang-Linie erfordern oder nicht. Es gibt jedoch zwei bekannte Gründe, warum die shebang-Zeile für die Verwendung von Python-Skripten unter Linux erforderlich ist.

  1. Python-Codes in einem ausführbaren Skript auszuführen, dh zu definieren, wie die Codes ausgeführt werden sollen und mit welchem ​​Interpreter;

  2. Ausführen von Python-Codes in Bezug auf eine bestimmte Version von Python, dh Ausführen von Codes, die nur mit Python 2.X oder Python 3.X kompatibel sind

Übe mit Python-Skripten

Unten sind die Liste und der Inhalt der Dateien aufgeführt, mit denen ich Fälle gezeigt habe, in denen die #!(shebang) -Zeile erforderlich oder nicht erforderlich ist.

$  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 enthält nur Quellcode.

    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2.py Enthält den Quellcode und die Shebang-Zeile.

    #!/usr/bin/env python
    import sys
    sys.stdout.write("Hello from Python %s\n" % (sys.version,))
    print("Hello, World!")
  • hello2e.pyenthält dasselbe wie hello2.pyund ausführbar gemacht.

  • hello3.pyEnthält dasselbe wie hello2.py, mit der Ausnahme, dass es für die Ausführung mit Python 3 angepasst ist, indem die erste Zeile in umbenannt wird #!/usr/bin/env python3.

  • hello3e.pyenthält dasselbe wie hello3.pyund ausführbar gemacht.

  • hello3m.pyenthält dasselbe wie hello3.pyund ausführbar gemacht, außer mit Write Unicode BOMOption im Texteditor zB Mousepad gespeichert.

Darüber hinaus werden dem Benutzer zwei Methoden zum Ausführen der Python-Skripte vorgestellt. Beide Methoden wurden wie folgt demonstriert.

Methode 1: Führen Sie mit Python-Programm

Nachfolgend sind die Befehle und Ausgaben aufgeführt, die beim Ausführen des Quellcodes mit Python 2 und Python 3 ausgeführt werden.

$  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!

Beide Versionen von Python konnten das Skript erfolgreich ausführen. Daher ist die shebang-Zeile nicht erforderlich, wenn das Python-Skript über pythonoder mit dem python3Befehl ausgeführt wird.

Methode 2: Als Python-Skript ausführen

Nachfolgend sind die Befehle und Ausgaben aufgeführt, die beim Ausführen des Quellcodes mit der shebang-Zeile ausgegeben werden. Diese sind weder für Python 2 noch für Python 3 geeignet, einschließlich nicht ausführbarer und ausführbarer Fälle.

$  ./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!

Die ersten drei Skripte sind fehlgeschlagen, da diese Skripte unabhängig von der shebang-Zeile nicht ausführbar sind (unterstützende Beweise siehe Zusätzliches Beispiel unten). Die letzten beiden Skripte haben eine "Shebang Line" und sind ausführbar.

Anscheinend ist ein Skript, das ausführbar gemacht wurde, ohne die shebang-Zeile im Wesentlichen nutzlos. Daher ist die shebang-Zeile erforderlich und das Skript muss ausführbar sein, wenn die Python-Codes in einem ausführbaren Skript ausgeführt werden.

Bei shebang klappt das nicht

In meinem vorbereiteten und getesteten Beispiel ist die Ausführung hello3m.pyals ausführbares Skript fehlgeschlagen und hat einen Fehler zurückgegeben.

$  ./hello3m.py 
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory

Dies ist eine bekannte Einschränkung, dass shebang nicht funktioniert oder ungültig wird. Wenn eine Datei als Unicode-Stückliste (Byte Order Mark) gespeichert wird, kann sie nicht normal als ausführbares Python-Skript ausgeführt werden.

Zusätzliches Beispiel

Dieses zusätzliche Beispiel gilt nur als Beleg. Der Benutzer sollte es vermeiden, dieses Beispiel auszuführen, obwohl das Ergebnis harmlos ist.

Ich habe eine andere Datei namens erstellt hello1e.py, die dieselbe enthält hello1.pyund ausführbar gemacht hat. Das Ausführen dieses Skripts hat einen Syntaxfehler zurückgegeben.

$  ./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,))'

Wenn Sie dieses Skript ausführen, wird der Mauszeiger zunächst in ein Pluszeichen geändert und ändert nichts an der Darstellung. Der Syntaxfehler wird erst angezeigt, wenn ich auf den Desktop oder das Terminal-Fenster geklickt habe. Anschließend erstellt dieses Skript eine sysDatei im selben Verzeichnis wie das Skript.

$  file sys
sys: PostScript document text conforming DSC level 3.0, Level 1

Die sysDatei wurde als PostScript-Datei ohne Dateierweiterung identifiziert. Diese Datei kann im Document Viewer (zB Evince) geöffnet werden, und die Datei enthält tatsächlich einen Screenshot des Fensters, auf das ich zuvor geklickt habe. Nach meiner Erfahrung kann die Datei nur wenige Megabyte groß sein.

Auch hier ist die shebang-Zeile erforderlich und das Skript muss ausführbar sein, wenn das Python-Skript als ausführbares Skript ausgeführt wird. Andernfalls verhält sich das Skript wie oben beschrieben fehlerhaft.

Zusätzliche Bemerkungen

Der Begriff "ausführbar gemacht" oder "muss ausführbar sein" bezieht sich auf die Berechtigung zum Ausführen des Skripts. Dies erfolgt durch Ausführen des chmod +x FILENAMEBefehls in Terminal oder durch Aktivieren der Option "Diese Datei als Programm ausführen lassen" oder einer ähnlichen Option im Eigenschaftenfenster in einem Dateimanager.

Während andere existierende Antworten fast alles abgedeckt hatten, hat diese Antwort einen anderen Ansatz gewählt, indem praktische Beispiele zur Erläuterung der Angelegenheit verwendet wurden. Die Codesyntax wurde sorgfältig so geschrieben, dass die Beispiele unverändert mit Python 2 oder Python 3 ausgeführt werden können.

Die Python-Codes wurden von Using Python unter Windows und Using Python unter Unix-Plattformen mit zusätzlichem einzeiligen Code des allgegenwärtigen "Hello, World!" Programm.

Alle Codes und Befehle wurden vollständig getestet und funktionieren unter Xubuntu 14.04, auf dem standardmäßig Python 2.7 und Python 3.4 installiert sind.

Clearkimura
quelle
4

Wenn diese Datei ausgeführt wird, weiß Ihr Computer, dass er sie mit dem Programm ausführen kann. Auf diese /usr/bin/pythonWeise unterscheiden Sie sie von einer anderen Sprache, wie z. B. bash, von der Sie sie ausführen würden #!/bin/bash. Dies ist so, dass Sie einfach ausführen können:

./[file-to-execute]

Und es wird wissen, mit welcher Datei es ausgeführt werden soll, anstatt dass Sie selbst Folgendes angeben müssen:

python ./[file-to-execute].py

Das #!Teil wird allgemein als Shebang oder Crunchbang bezeichnet .

muru
quelle
2
Auch ein Hashbang.
Naftuli Kay
1

Wenn Sie mehrere Versionen von Python installiert haben, stellen Sie /usr/bin/envsicher , dass der verwendete Interpreter der erste in Ihrer Umgebung ist $PATH. Die Alternative wäre, so etwas hart zu codieren #!/usr/bin/python.

In Unix kann eine ausführbare Datei, die interpretiert werden soll, angeben, welcher Interpreter verwendet werden soll, indem #!am Anfang der ersten Zeile ein steht, gefolgt vom Interpreter (und eventuell benötigten Flags).

Diese Regel gilt nur für UNIX-basierte Systeme.

orvi
quelle
0

hilfreich für Betriebssysteme wie Linux, wo Python 2.x immer noch der Standard ist, aber die meisten Leute auch 3.x herunterladen.

2.x würde standardmäßig ausgeführt. Also mein 3.x-Code, ich Präfix mit #! / Usr / bin / env python3, so dass 3.x den Code ausführt. Ich kann sogar bis zur kleinen Revision (Python 3.xyz) angeben, ob ich Betaversionen oder nur etwas ältere Versionen haben möchte.

user21784
quelle