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...
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...
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 :
.
Dans le cas des fichiers Python, il s'agit généralement de .py
..py
doivent être ouverts à l'aide de la nouvelle version de l'application application Python (c'est-à-dire l'interpréteur Python)..exe
y .bat
sont exécutés comme des scripts batchscripts..py
en utilisant python.exe
il devrait les ouvrir avec un autre programme, tel qu'un éditeur de texte. notepad.exe
.
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 :
.py
à la fin afin qu'ils soient automatiquement reconnus comme tels..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 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.Cela présente quelques avantages :
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>
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.
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
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
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 .
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.