61 votes

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

Question assez simple : Sous Linux, pourquoi Python requiert-il la ligne

#!/usr/bin/python

au début d'un fichier Python, puisque Windows ne le fait pas ?

Qu'est-ce qu'il fait ? Parce que la description "Liens vers Python" est un peu vague...

74voto

Jason Swett Points 101

Python n'a pas d'exigence particulière de ce type pour Linux. C'est le chargeur de programme sur 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 une vue d'ensemble ainsi qu'une comparaison avec Windows ici.

Tout d'abord, examinons la situation sous Windows :

  • Lorsque vous tentez d'ouvrir ou d'exécuter un fichier, Windows examine d'abord le fichier extension de ce fichier. 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 du fichier.
    • Ces informations sont enregistrées dans le registre de Windows ; lorsque Python est installé, il indique généralement à Windows que .py doivent être ouverts à l'aide de la nouvelle version de l'application application Python (c'est-à-dire l'interpréteur Python).
    • Plusieurs types de fichiers ont des comportements intégrés ; par exemple, les fichiers exécutables (comme l'interpréteur Python lui-même) doivent se terminer par .exe y .bat sont exécutés comme des scripts batchscripts.
    • L'action prise pour un type de fichier particulier est personnalisable . Vous pouvez, par exemple, dire à Windows qu'au lieu d'exécuter .py en utilisant python.exe il devrait les ouvrir avec un autre programme, tel qu'un éditeur de texte. notepad.exe .
      • Dans ce cas, afin de exécuter un script Python, vous devrez manuellement appelez python <scriptname>.py (ou écrire un .bat pour le faire à votre place).

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

Il est donc un peu trompeur de dire que Windows "n'a pas besoin" de l'interface utilisateur. #! ligne ; Windows ne véase el #! et s'appuie en fait sur l'extension du fichier pour lui indiquer ce qu'il doit faire. Cela présente quelques inconvénients :

  • Usted doit nom Python scripts avec .py à la fin afin qu'ils soient automatiquement reconnus comme tels.
  • Il n'y a pas de moyen facile de distinguer les scripts de Python2 des scripts de Python3.
  • Comme indiqué précédemment, si vous modifiez le comportement de lancement par défaut de l'application .py Windows n'exécutera plus automatiquement ces scripts avec Python. Notez que cela pourrait être fait de manière non intentionnelle.

Maintenant, regardons comment Unix/Linux lance les scripts :

La première chose à noter est qu'Unix/Linux, contrairement à Windows, n'essaie pas d'"ouvrir" les scripts Python à l'aide d'un programme particulier, du moins conceptuellement ; l'OS connaît que le script est quelque chose qui peut être exécuté en raison de quelque chose appelé le "bit d'exécution" (qui est en dehors de la portée de cette réponse). Donc, si vous tapez accidentellement #!/usr/bin/pthon au lieu de #!/usr/bin/python vous obtiendrez un message d'erreur comprenant ce texte :

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

Le mot "interpréteur" 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 programmes Unix/Linux examine les deux premiers octets de ce fichier ; si ces deux octets sont #! le chargeur interprète le reste de la ligne shebang (à l'exception de la shebang elle-même) comme une commande de lancement d'un fichier de type interprète avec lequel on peut exécuter le contenu du fichier comme un script.
  • Le chargeur de programme lance l'interpréteur spécifié, en lui fournissant les données suivantes chemin du fichier d'origine comme argument.

Cela présente quelques avantages :

  • Le script-writer a plus de contrôle sur l'interpréteur qui sera utilisé (ce qui résout le problème de Python2/Python3) et peut parfois passer un argument supplémentaire à l'interpréteur (voir la page Wiki pour les 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 fait no besoin de la ligne shebang afin d'exécuter un script Python. Rappelons que la ligne shebang ne fait que permettre au chargeur de programmes de sélectionnez un interprète. Mais tout comme sous Windows, cela peut être fait manuellement :

python <myscript>

43voto

Joe the Person Points 5090

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 tout argument qui doit être passé à ce programme lors de l'exécution du script. Il ne s'agit toutefois pas d'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 non pas le passer à 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/file directement, sans fournir également l'interpréteur à utiliser (tel que python ).


Pour un script de Bash, il aurait quelque chose comme ceci :

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

Cela indiquerait au système que, lorsque cette opération est exécutée, elle doit l'être par l'intermédiaire de /bin/bash qui est l'un des shells / Shell-Shell du système.


Pour le code Python, cependant, ici, vous allez vouloir que le fichier exécutable soit exécuté via Python, donc vous lui indiquez quel interpréteur vous avez l'intention de faire 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 Python 3, selon la configuration de votre système).


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

Sans cette ligne au début, et en supposant que vous avez configuré le fichier/script pour être 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 en Bash, il faudrait faire bash script.sh ou similaire pour d'autres scripts/langues, comme Perl, Ruby, etc.)

La coloration syntaxique ci-dessus est spécifique à chaque langue dans chaque section, bien que cela n'ait pas vraiment d'importance.

17voto

heemayl Points 85741

La ligne :

#!/usr/bin/python

est appelé "shebang" et indique le chemin vers l'interpréteur binaire qui sera utilisé pour interpréter le reste des commandes du fichier. C'est généralement la première ligne d'un script.

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

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

python script_name

De même, dans le cas de #!/bin/bash :

bash script_name

7voto

jptsetme Points 78

Techniquement, ça ne l'exige pas. Il requiert un chemin vers l'environnement où votre script s'exécute. Vos futurs script feraient mieux d'inclure /usr/bin/env alors, spécifiez Python. Cela garantit que votre script s'exécute dans l'environnement Python, peu importe où Python est installé. Vous voulez faire cela pour des raisons de compatibilité, vous ne pouvez pas être sûr que la prochaine personne avec qui vous partagez votre code aura Python installé dans usr/bin/Python, ou qu'elle aura les permissions pour ces fichiers système.

Voici une question similaire de stack overflow .

Ce que cela donne dans votre script est :

#!/usr/bin/env python

Je constate également une certaine inquiétude quant à la manière de spécifier python3. Voici comment procéder :

#!/usr/bin/env python3

4voto

Cela signifie que lorsque ce fichier est exécuté, votre ordinateur sait qu'il doit l'exécuter avec le programme /usr/bin/python c'est ce qui le différencie d'un autre langage, tel que bash, où l'on fait #!/bin/bash . Ceci afin que vous puissiez simplement courir :

./[file-to-execute]

Et il saura avec quel fichier l'exécuter, au lieu que vous deviez vous-même le spécifier avec quelque chose comme :

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

Le site #! est communément appelée shebang , crunch bang o hashbang .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X