web-dev-qa-db-fra.com

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 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 de l’interprète python dans PATH ou non. Merci.

65
Stan

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 de scripts executable uniquement. Vous pouvez la voir documentée en détail sur la page de manuel de execve(2) . Vous constaterez que le mot suivant #! doit être le chemin d’un exécutable valide. Alors

#!/usr/bin/env python

exécute quelle que soit python sur le $PATH des utilisateurs. Ce formulaire résiste aux déplacements de l’interprète Python, ce qui le rend un peu plus portable, mais cela signifie également que l’utilisateur peut remplacer l’interpréteur Python standard en le précédant dans $PATH. Selon vos objectifs, ce comportement peut ne pas être correct.

Suivant,

#!/usr/bin/python

traite du cas courant dans lequel un interpréteur Python est installé dans /usr/bin. Si c'est installé ailleurs, vous perdez. Mais c’est un bon moyen de vous assurer d’obtenir exactement la version que vous voulez ou bien rien du tout (comportement "fail-stop"), comme dans 

#!/usr/bin/python2.5

Finalement,

#!python

ne fonctionne que s'il existe un exécutable python dans le répertoire en cours lors de l'exécution du script. Non recommandé.

85
Norman Ramsey


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 codage:

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

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

"""This is a awesome
    python script!"""

Et bien 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 joyeux codage.

21
Dimitar Atanasov

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

5
Mark Byers

Dans la page de manuel relative à 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 de 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 à env vous permet de spécifier abstraitement python sans en connaître le chemin.)

2
Annika Backstrom

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

Lorsque vous utilisez virtualenv, il peut même s'agir de quelque chose comme ~/projects/env/bin/python

1
Almad

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 reposent sur python virtualenv. Chaque virtualenv a sa propre version du binaire python, indispensable pour ajouter des packages installés dans virtualenv au chemin python (sans toucher à PYTHONPATH env).

De plus en plus de gens ont commencé à utiliser virtualenv pour le développement python préfèrent utiliser /usr/bin/env python à moins que vous ne vouliez pas que les gens utilisent leur binaire python personnalisé.

Remarque: 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 des idées de ici .

0
Jatin Kumar