Python >> Tutoriel Python >  >> Python Tag >> Linux

Pourquoi Python sous Linux nécessite-t-il la ligne #!/usr/bin/python ?

Python n'a pas une telle exigence spéciale sur Linux. C'est le chargeur de programme sous Unix/Linux qui utilise la ligne "shebang", comme on l'appelle. Il s'agit en fait d'une fonctionnalité plutôt que d'une limitation, mais nous y reviendrons dans un instant. La page Wiki sur "shebang" contient plus de détails, mais je vais essayer de donner un aperçu ainsi qu'une comparaison avec Windows ici.

D'abord, examinons la situation sous Windows :

  • Lorsque vous essayez d'ouvrir ou d'exécuter un fichier, Windows examine d'abord l'extension de ce dossier. C'est le dernier partie du nom de fichier commençant par . Dans le cas des fichiers Python, il s'agit généralement de .py .
  • Windows recherche l'action à entreprendre en fonction de l'extension de fichier.
    • Ces informations sont enregistrées dans le registre Windows ; lorsque Python est installé, il indique généralement à Windows que .py les fichiers doivent être ouverts à l'aide de l'application nouvellement installée Python (c'est-à-dire l'interpréteur Python).
    • Plusieurs types de fichiers ont des comportements intégrés ; par exemple, les fichiers exécutables (tels que l'interpréteur Python lui-même) doivent se terminer par .exe , et .bat les fichiers sont exécutés en tant que scripts batch Windows.
    • L'action entreprise pour un type de fichier particulier est personnalisable . Vous pouvez, par exemple, indiquer à Windows qu'au lieu d'exécuter .py fichiers utilisant python.exe , il devrait les ouvrir avec un autre programme, tel que l'éditeur de texte notepad.exe .
      • Dans ce cas, pour exécuter un script Python, vous auriez besoin de manuellement appeler le python <scriptname>.py (ou écrire un .bat fichier pour le faire pour vous).

Maintenant, que se passe-t-il s'il y a une ligne shebang (#!/usr/bin/python ou #!/usr/bin/env python ) en haut du script Python ? Eh bien, depuis # est une ligne de commentaire en Python, l'interpréteur Python l'ignore simplement. C'est l'une des raisons pour lesquelles la plupart des langages de script utilisés dans le monde Unix/Linux utilisent # pour commencer les lignes de commentaires.

Il est donc un peu trompeur de dire que Windows "n'a pas besoin" du #! ligne; Windows ne voit pas le #! ligne, et s'appuie en fait sur l'extension de fichier pour lui dire quoi faire. Cela a quelques inconvénients :

  • Vous devez nommez les scripts Python avec .py à la fin afin qu'ils soient automatiquement reconnus comme tels.
  • Il n'existe aucun moyen simple de distinguer les scripts Python2 des scripts Python3.
  • Comme indiqué précédemment, si vous modifiez le comportement de lancement par défaut pour le .py file-type, Windows n'exécutera plus automatiquement ces scripts avec Python. Notez que cela peut être fait involontairement.

Maintenant, regardons comment Unix/Linux lance les scripts :

La première chose à noter est qu'Unix/Linux, contrairement à Windows, n'essaye pas "d'ouvrir" des scripts Python en utilisant un programme particulier, du moins conceptuellement; le système d'exploitation sait que le script est quelque chose qui peut être exécuté à cause de quelque chose appelé le "bit d'exécution" (qui sort du cadre de cette réponse). Donc, si vous tapez accidentellement #!/usr/bin/pthon au lieu de #!/usr/bin/python , vous recevrez un message d'erreur contenant ce texte :

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

Le mot "interprète" nous donne un indice sur le rôle de la ligne shebang (bien que techniquement le programme spécifié puisse être autre chose qu'un interpréteur, tel que cat ou un éditeur de texte). Lorsque vous tentez d'exécuter un fichier, voici ce qui se passe :

  • Le chargeur de programme Unix/Linux examine les deux premiers octets de ce fichier ; si ces deux octets sont #! , alors le chargeur interprète le reste de la ligne shebang (à l'exclusion du shebang lui-même) comme une commande pour lancer un interpréteur avec lequel exécuter le contenu du fichier en tant que script.
  • Le chargeur de programme lance l'interpréteur spécifié, en lui fournissant le chemin du fichier d'origine comme argument.

Cela présente plusieurs avantages :

  • Le scénariste a plus de contrôle sur l'interpréteur qui sera utilisé (ce qui résout le problème Python2/Python3) et peut parfois passer un argument supplémentaire à l'interpréteur (voir la page Wiki pour plus de détails).
  • Le nom de fichier du script est ignoré , vous pouvez donc nommer les scripts Python comme vous le souhaitez.

Notez, enfin, qu'Unix/Linux ne fait pas besoin la ligne shebang afin d'exécuter un script Python. Rappelez-vous que tout ce que fait la ligne shebang est de permettre au chargeur de programme de sélectionner un interprète. Mais tout comme sous Windows, cela peut être fait manuellement :

python <myscript>

La ligne que vous avez indiquée est utilisée pour indiquer à l'ordinateur quel programme/interpréteur utiliser lors de l'exécution directe du fichier/script, et tous les arguments qui doivent être passés à ce programme lorsque le script s'exécute. Ce n'est cependant pas une exigence de Python , c'est une exigence du noyau/système Linux si vous avez l'intention d'exécuter le script directement (et de ne pas le transmettre à Python par la syntaxe ci-dessous).

Il n'est pas nécessaire si vous allez exécuter python script.py ou similaire. Il n'est nécessaire que si vous avez l'intention d'exécuter le script/fichier directement, sans fournir également l'interpréteur à utiliser (tel que python ).

Pour un script Bash, il aurait quelque chose comme ça :

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

Cela indiquerait au système que, lorsque cela s'exécute, il doit être exécuté via /bin/bash qui est l'un des shells / langages de script shell du système.

Pour le code Python, cependant, ici, vous allez vouloir que le fichier exécutable s'exécute via Python, donc vous lui dites quel interpréteur vous avez l'intention d'y exécuter.

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

Ceci, comme pour Bash, indique que /usr/bin/python doit être utilisé (il s'agit probablement de Python 2 ou de Python 3, en fonction de la configuration de votre système).

De cette façon, vous pouvez exécuter ./filename.py ou ./executable ou ./scripttorun directement.

Sans cette ligne au début, et en supposant que vous avez défini le fichier/script pour qu'il soit exécutable, et en supposant que vous travaillez avec un script Python, vous devriez exécuter python filename.py ou similaire si vous n'aviez pas le #!/usr/bin/python ligne. (Pour un script Bash, il faudrait faire bash script.sh , ou similaire pour d'autres scripts/langages, tels que Perl, Ruby, etc.)

La mise en évidence de la syntaxe ci-dessus est spécifique à la langue dans chaque section, bien que cela n'ait pas vraiment d'importance.


La ligne :

#!/usr/bin/python

s'appelle le 'shebang' et indique le chemin vers le binaire de l'interpréteur qui sera utilisé pour interpréter le reste des commandes dans le fichier. Il s'agit généralement de la première ligne d'un script.

Donc la ligne #!/usr/bin/python indique que le contenu du fichier sera interprété par le python binaire situé à /usr/bin/python .

Notez que la ligne shebang est analysée par le noyau, puis le script sera éventuellement appelé en tant qu'argument :

python script_name

De même en cas de #!/bin/bash :

bash script_name