Sous Linux, Python peut nécessiter ou non la ligne #!
(shebang). Cela dépend de la manière dont les codes Python sont gérés, qu'ils soient exécutés en mode interactif Python ou dans un script Python.
Le mode interactif Python permet à l’utilisateur de taper et d’exécuter des codes Python directement, ce qui ne nécessite pas la ligne shebang. Pour exécuter le mode interactif, ouvrez un terminal et tapez python
pour Python 2.X ou python3
pour Python 3.X.
$ 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.
>>>
Le script Python permet à l'utilisateur d'écrire et de sauvegarder les codes Python dans un fichier en texte brut, puis de les exécuter ultérieurement. Cela peut ou peut ne pas nécessiter la ligne shebang. Cependant, il existe deux raisons connues pour lesquelles la ligne shebang est requise pour utiliser un script Python sous Linux.
exécuter des codes Python dans un script exécutable, c'est-à-dire définir comment les codes doivent être exécutés et en utilisant quel interpréteur;
pour exécuter les codes Python en fonction d'une version spécifique de Python, c.-à-d. des codes compatibles avec Python 2.X ou Python 3.X uniquement
Pratique avec les scripts Python
Vous trouverez ci-dessous la liste et le contenu des fichiers, que j’ai utilisés pour montrer aux cas où la ligne #!
(shebang) est requise ou non.
$ 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
contient uniquement du code source.
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2.py
contient le code source et la ligne shebang.
#!/usr/bin/env python
import sys
sys.stdout.write("Hello from Python %s\n" % (sys.version,))
print("Hello, World!")
hello2e.py
contient même que hello2.py
et rendu exécutable.
hello3.py
contient same as hello2.py
, sauf qu'il est adapté pour fonctionner avec Python 3 en renommant la première ligne #!/usr/bin/env python3
.
hello3e.py
contient même que hello3.py
et rendu exécutable.
hello3m.py
contient la même chose que hello3.py
et est exécutable, sauf l' Write Unicode BOM
option enregistrée dans l'éditeur de texte, à savoir Mousepad.
Au-delà de ce point, deux méthodes d’exécution des scripts Python seront présentées à l’utilisateur. Les deux méthodes ont été démontrées ci-dessous.
Méthode 1: Exécuter avec le programme Python
Vous trouverez ci-dessous les commandes et les résultats lors de l’exécution du code source avec Python 2 et Python 3.
$ 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!
Les deux versions de Python ont pu exécuter le script avec succès. Par conséquent, la ligne shebang n'est pas requise lors de l'exécution du script Python via python
ou python3
commande.
Méthode 2: Exécuter en tant que script Python
Vous trouverez ci-dessous les commandes et les résultats lors de l'exécution du code source avec la ligne shebang, qui ne sont adaptés à aucun des deux, Python 2 et Python 3, y compris les cas non exécutables et exécutables.
$ ./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!
Les trois premiers scripts ont échoué car ils ne sont pas exécutables, qu'ils aient ou non la ligne shebang (pour la preuve, voir l' exemple supplémentaire ci-dessous). Les deux derniers scripts ont une ligne shebang et sont exécutables.
Apparemment, un script qui a été rendu exécutable est essentiellement inutile sans la ligne shebang. Par conséquent, la ligne shebang est requise et le script doit être exécutable lors de l'exécution des codes Python dans un script exécutable.
Quand shebang ne fonctionne pas
Dans mon exemple préparé et testé, l'exécution en hello3m.py
tant que script exécutable a échoué et a renvoyé une erreur.
$ ./hello3m.py
./hello3m.py: line 1: #!/usr/bin/env: No such file or directory
C'est une limitation connue que shebang ne fonctionne pas ou devient invalide. Lorsqu'un fichier est enregistré en tant que BOM Unicode (Byte Order Mark), son exécution normale en tant que script Python est impossible.
Exemple supplémentaire
Cet exemple supplémentaire ne doit être considéré que comme une preuve à l'appui. L'utilisateur doit éviter d'exécuter cet exemple, même si le résultat est inoffensif.
J'ai créé un autre fichier appelé hello1e.py
, qui contient le même hello1.py
et qui est rendu exécutable. L'exécution de ce script a renvoyé une erreur de syntaxe.
$ ./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,))'
Lors de l'exécution de ce script, le curseur de la souris devient d'abord un signe plus et ne fait rien en apparence. L'erreur de syntaxe ne sera pas affichée jusqu'à ce que je clique sur la fenêtre du bureau ou du terminal. Ensuite, ce script créera un sys
fichier dans le même répertoire que le script.
$ file sys
sys: PostScript document text conforming DSC level 3.0, Level 1
Le sys
fichier a été identifié en tant que fichier PostScript, sans extension de fichier. Ce fichier peut être ouvert dans la visionneuse de documents, par exemple Evince, et le fichier contenait en fait une capture d'écran de la fenêtre sur laquelle j'avais cliqué précédemment. D'après mon expérience, le fichier peut atteindre quelques mégaoctets.
Une fois encore, la ligne shebang est requise et le script doit être exécutable lors de l'exécution du script Python en tant que script exécutable. Sinon, le script se comportera de la manière décrite ci-dessus.
Notes complémentaires
Le terme "rendu exécutable" ou "doit être exécutable" fait référence à la permission d'exécuter le script. Ceci est effectué en exécutant la chmod +x FILENAME
commande dans Terminal ou en cochant l’option "Autoriser l’exécution de ce fichier en tant que programme" ou quelque chose de similaire dans la fenêtre Propriétés , dans un gestionnaire de fichiers.
Alors que d'autres réponses existantes couvraient presque tout, cette réponse a adopté une approche différente en utilisant des exemples pratiques pour expliquer le problème. La syntaxe du code a été écrite avec soin, de telle sorte que les exemples puissent être exécutés avec Python 2 ou Python 3, en l’état.
Les codes Python ont été adaptés de Utilisation de Python sous Windows et Utilisation de Python sous Unix , avec un code supplémentaire à une ligne de l'omniprésent "Hello, World!" programme.
Tous les codes et toutes les commandes ont été entièrement testés et fonctionnent dans le système Xubuntu 14.04, sur lequel Python 2.7 et Python 3.4 étaient installés par défaut.
.
) pour déterminer le type de fichier. Même Windows s'éloigne de cela: examinez les premières lignes du fichier Microsoft Word, qui indiqueront qu'il s'agit en fait d'un fichier Microsoft Word.