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.

60
demandé sur Stan 2010-06-27 23:50:26

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é.

79
répondu Norman Ramsey 2010-06-28 01:33:34


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.

18
répondu Dimitar Atanasov 2017-07-09 10:17:13

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/envest plus portable.

5
répondu Mark Byers 2010-06-27 19:53:15

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.)

2
répondu Annika Backstrom 2010-06-27 19:54:38

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

1
répondu Almad 2010-06-27 19:52:39

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.

0
répondu Jatin Kumar 2014-12-11 11:46:35