73 votes

En-tête du script Python

L'en-tête typique devrait être

#!/usr/bin/env python

Mais j'ai trouvé que ce qui suit fonctionne également lors de l'exécution du script comme $python ./my_script.py

#!/usr/bin/python
#!python

Quelle est la différence entre ces 2 en-têtes ? Quel pourrait être le problème pour le 2ème ? Veuillez également discuter du cas où l'interpréteur python est dans le PATH ou non. Merci.

93voto

Norman Ramsey Points 115730

Tout d'abord, à chaque fois que vous exécutez un script en utilisant explicitement l'interpréteur, comme dans

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

la ligne #! est toujours ignorée. La ligne #! est une fonctionnalité Unix des scripts exécutables uniquement, et vous pouvez la trouver documentée entièrement sur la page de manuel pour execve(2). Vous y trouverez que le mot suivant #! doit être le chemin d'accès d'un exécutable valide. Ainsi

#!/usr/bin/env python

exécute n'importe quel python se trouvant dans le $PATH de l'utilisateur. Ce format est résilient au déplacement de l'interpréteur Python, ce qui le rend quelque peu portable, mais cela signifie également que l'utilisateur peut remplacer l'interpréteur Python standard en plaçant quelque chose devant dans $PATH. En fonction de vos objectifs, ce comportement peut être acceptable ou non.

Ensuite,

#!/usr/bin/python

traite le cas courant où un interpréteur Python est installé dans /usr/bin. Si il est installé ailleurs, vous perdez. Mais il s'agit d'une bonne façon de garantir que vous obtenez exactement la version désirée ou rien du tout (comportement "stop-erreur"), comme dans

#!/usr/bin/python2.5

Enfin,

#!python

fonctionne seulement s'il y a un exécutable python dans le répertoire courant lorsque le script est exécuté. Non recommandé.

35voto

Dimitar Atanasov Points 467

Je suggérerais 3 choses au début de votre script :

Tout d'abord, comme déjà dit, utilisez l'environnement :

#!/usr/bin/env python

Deuxièmement, définissez votre encodage :

# -*- coding: utf-8 -*-

Troisièmement, définissez une chaîne de documentation :

"""Ceci est un script python génial !"""

Et bien sûr, j'utiliserais " " (4 espaces) pour l'indentation.
L'en-tête final ressemblera à :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Ceci est un script python génial !"""

Meilleurs vœux et joyeux codage.

5voto

Mark Byers Points 318575

L'exécutable Python peut être installé à un emplacement autre que /usr/bin, mais env est presque toujours présent à cet emplacement, donc l'utilisation de /usr/bin/env est plus portable.

2voto

Annika Backstrom Points 8138

Depuis la page de manuel de env (GNU coreutils 6.10):

env - exécute un programme dans un environnement modifié

En théorie, vous pourriez utiliser env pour réinitialiser l'environnement (supprimer de nombreuses variables d'environnement existantes) ou ajouter des variables d'environnement supplémentaires dans l'en-tête du script. En pratique, les deux versions que vous avez mentionnées sont identiques. (Bien que d'autres aient mentionné un bon point : spécifier python via env vous permet de spécifier abstraitement python sans connaître son chemin.)

1voto

Almad Points 2091

Oui, il y a - python peut ne pas être dans /usr/bin, mais par exemple dans /usr/local/bin (BSD).

Lors de l'utilisation de virtualenv, cela peut même être quelque chose comme ~/projects/env/bin/python

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X