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