En-tête de script Python
L'en-tête typique devrait être
#!/usr/bin/env python
, Mais j'ai trouvé ci-dessous fonctionne également lorsque 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 de l'interpréteur python est dans PATH ou non. Grâce.
6 réponses
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 scriptsexécutables uniquement, et vous pouvez la voir documentée dans son intégralité sur la page de manuel pour execve(2)
. Là, vous trouverez que le mot suivant #!
doit être le chemin d'un exécutable valide. Alors
#!/usr/bin/env python
Exécute ce que python
est sur les utilisateurs de $PATH
. Cette forme est résiliente au Python l'interpréteur étant déplacé, ce qui le rend un peu plus portable, mais cela signifie également que l'utilisateur peut remplacer l'interpréteur Python standard en mettant quelque chose devant lui dans $PATH
. Selon vos objectifs, ce comportement peut ou non être correct.
Suivant,
#!/usr/bin/python
Traite du cas courant dans lequel un interpréteur Python est installé dans /usr/bin
. Si elle est installée ailleurs, vous perdez. Mais c'est un bon moyen de vous assurer d'obtenir exactement la version que vous voulez ou autre rien du tout (comportement"fail-stop"), comme dans
#!/usr/bin/python2.5
Enfin,
#!python
Ne fonctionne que s'il y a un exécutable python
dans le répertoire courant lors de l'exécution du script. Pas recommandé.
Je suggère 3 choses au début de votre script:
Tout d'abord, comme déjà dit utiliser l'environnement:
#!/usr/bin/env python
Ensuite, définissez votre encodage:
# -*- coding: utf-8 -*-
Troisièmement, définissez une chaîne doc:
"""This is a awesome
python script!"""
Et à coup sûr, j'utiliserais " "
(4 espaces) pour ident.
L'en-tête Final ressemblera à:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""This is a awesome
python script!"""
Meilleurs voeux et bon codage.
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.
De la page de manuel pour env
(GNU coreutils 6.10):
env - run a program in a modified environment
En théorie, vous pouvez utiliser env
pour réinitialiser l'environnement (en supprimant de nombreuses variables d'environnement existantes) ou ajouter des variables d'environnement supplémentaires dans l'en-tête du script. Pratiquement parlant, les deux versions que vous avez mentionnées sont identiques. (Bien que d'autres aient mentionné un bon point: spécifier python
à travers env
vous permet de spécifier abstraitement python
sans connaître son chemin.)
Oui, il y a-python peut ne pas être dans /usr/bin
, mais par exemple dans /usr/local/bin
(BSD).
Lorsque vous utilisez virtualenv, cela peut même être quelque chose comme ~/projects/env/bin/python
Le /usr/bin/env python
devient très utile lorsque vos scripts dépendent de paramètres d'environnement, par exemple en utilisant des scripts qui dépendent de python virtualenv
. Chaque virtualenv a sa propre version de Python binary qui est nécessaire pour ajouter des paquets installés dans virtualenv au chemin python (sans toucher à PYTHONPATH env).
Comme de plus en plus de gens ont commencé à utiliser virtualenv pour le développement python préfèrent utiliser /usr/bin/env python
sauf si vous ne voulez pas que les gens utilisent leur binaire Python personnalisé.
Note: Vous devez également comprendre qu'il existe des problèmes de sécurité potentiels (dans les environnements multi-utilisateurs) lorsque vous laissez les utilisateurs exécuter vos scripts dans leurs environnements personnalisés. Vous pouvez obtenir quelques idées de ici.