web-dev-qa-db-fra.com

Dois-je mettre #! (Shebang) dans Python scripts, et quelle forme doit-il prendre?

Dois-je mettre le Shebang dans mes scripts Python? Sous quelle forme?

#!/usr/bin/env python 

ou

#!/usr/local/bin/python

Sont-ils également portables? Quelle forme est la plus utilisée?

Remarque: le projet tornade utilise le Shebang. D'autre part, le projet Django ne le fait pas.

701
treecoder

La ligne Shebang de tout script détermine sa capacité à être exécutée comme un exécutable autonome sans saisir python au préalable dans le terminal ou lors du double-clic dans un gestionnaire de fichiers (correctement configuré). Ce n'est pas nécessaire, mais généralement mis là, donc quand quelqu'un voit le fichier ouvert dans un éditeur, il sait immédiatement ce qu'il regarde. Cependant, la ligne Shebang que vous utilisez EST importante.

L'utilisation correcte des Python 3 scripts est la suivante:

#!/usr/bin/env python3

La valeur par défaut est la version 3.latest. Pour Python 2.7.latest, utilisez python2 à la place de python3.

Les éléments suivants NE doivent PAS être utilisés (sauf dans le cas rare où vous écrivez un code compatible avec les deux Python 2.x et 3.x):

#!/usr/bin/env python

La raison de ces recommandations, donnée dans PEP 394 , est que python peut faire référence à python2 ou python3 sur différents systèmes. Il fait actuellement référence à python2 sur la plupart des distributions, mais cela est susceptible de changer à un moment donné.

Aussi, NE PAS utiliser:

#!/usr/local/bin/python

"Python peut être installé dans/usr/bin/python ou/bin/python dans ces cas, le #! ci-dessus va échouer."

-- "#!/usr/bin/env python" vs "#!/usr/local/bin/python"

950
GlassGhost

C'est vraiment juste une question de goût. L'ajout de Shebang signifie que les utilisateurs peuvent appeler le script directement s'ils le souhaitent (en supposant qu'il soit marqué comme exécutable). l'omettre signifie simplement que python doit être appelé manuellement.

Le résultat final de l'exécution du programme n'est pas affecté de toute façon; ce ne sont que des options de moyens.

68
Amber

Dois-je mettre le Shebang dans mes scripts Python?

Mettez un Shebang dans un script Python pour indiquer:

  • ce module peut être exécuté en tant que script
  • si elle peut être exécutée uniquement sur python2, python3 ou est-ce compatible Python 2/3
  • sur POSIX, il est nécessaire si vous voulez exécuter le script directement sans appeler explicitement python exécutable

Sont-ils également portables? Quelle forme est la plus utilisée?

Si vous écrivez un Shebang manuellement , utilisez toujours #!/usr/bin/env python sauf si vous avez une raison spécifique de ne pas l'utiliser. Cette forme est comprise même sous Windows (lanceur Python).

Remarque: les scripts installés doivent utiliser un exécutable spécifique python, par exemple, /usr/bin/python ou /home/me/.virtualenvs/project/bin/python. Il est mauvais si un outil se brise si vous activez un virtualenv dans votre shell. Heureusement, le bon Shebang est créé automatiquement dans la plupart des cas par setuptools ou vos outils de package de distribution (sous Windows, setuptools peut générer automatiquement des scripts wrapper .exe).

En d'autres termes, si le script est dans une extraction de source, vous verrez probablement #!/usr/bin/env python. Si elle est installée, Shebang est un chemin d'accès à un exécutable spécifique python tel que #!/usr/local/bin/python (NOTE: vous ne devez pas écrire manuellement les chemins de cette dernière catégorie).

Pour choisir si vous devez utiliser python, python2 ou python3 dans Shebang, voir PEP 394 - La commande "python" sur les systèmes de type Unix :

  • ... python doit être utilisé dans la ligne Shebang uniquement pour les scripts compatibles avec les sources Python 2 et 3.

  • en prévision d'un changement éventuel de la version par défaut de Python, Python 2 scripts uniquement doivent être mis à jour pour être compatibles avec la source Python 3 ou bien pour utiliser python2 in la ligne Shebang.

25
jfs

Si vous avez plus d'une version de Python et que le script doit être exécuté sous une version spécifique, elle peut s'assurer que la bonne est utilisée lors de l'exécution directe du script, par exemple:

#!/usr/bin/python2.7

Notez que le script peut toujours être exécuté via une ligne de commande complète Python, ou via une importation, auquel cas la règle est ignorée. Mais pour les scripts exécutés directement, c’est une bonne raison d’utiliser le she-bang.

#!/usr/bin/env python est généralement la meilleure approche, mais cela aide dans certains cas particuliers.

Il est généralement préférable d’établir un environnement virtuel Python, auquel cas le nom générique #!/usr/bin/env python identifierait l’instance correcte de Python pour virtualenv.

15
Chris Johnson

Vous devez ajouter un Shebang si le script doit être exécutable. Vous devez également installer le script avec un logiciel d’installation qui modifie le Shebang en quelque chose de correct afin que cela fonctionne sur la plate-forme cible. Distutils et Distribute en sont des exemples.

10
Lennart Regebro

Shebang a pour but de permettre au script de reconnaître le type d'interprète lorsque vous souhaitez exécuter le script à partir du shell. Généralement, et pas toujours, vous exécutez des scripts en fournissant l'interprète en externe. Exemple d'utilisation: python-x.x script.py

Cela fonctionnera même si vous n'avez pas de déclarant Shebang.

Pourquoi la première est plus "portable", c'est parce que /usr/bin/env contient votre déclaration PATH qui prend en compte toutes les destinations où résident les exécutables de votre système.

REMARQUE: Tornado n'utilise pas strictement les shebangs, et Django ne l'utilise pas strictement. Cela dépend de la manière dont vous exécutez la fonction principale de votre application.

AUSSI: Cela ne varie pas avec Python.

9
meson10

Parfois, si la réponse n’est pas très claire (je veux dire que vous ne pouvez pas décider si oui ou non), alors cela n’a aucune importance, et vous pouvez ignorer le problème jusqu’à ce que la réponse est soit claire.

Le seul objet #! est de lancer le script. Django charge les sources et les utilise. Il n'est jamais nécessaire de décider quel interprète doit être utilisé. De cette façon, le #! n'a aucun sens ici.

Généralement, s’il s’agit d’un module et qu’il ne peut pas être utilisé comme script, il n’est pas nécessaire d’utiliser le #!. D'autre part, une source de module contient souvent if __== '__main__': ... avec au moins quelques tests triviaux de la fonctionnalité. Alors le #! a de nouveau un sens.

Une bonne raison d'utiliser #! est lorsque vous utilisez les deux scripts Python 2 et Python 3 - ils doivent être interprétés par différentes versions de Python. De cette façon, vous devez vous rappeler ce que python doit être utilisé lors du lancement manuel du script (sans le #! à l'intérieur). Si vous avez un mélange de tels scripts, c'est une bonne idée d'utiliser le #! à l'intérieur, de les rendre exécutables et de les lancer en tant qu'exécutables (chmod ...).

Lorsque vous utilisiez MS-Windows, le #! n'avait aucun sens - jusqu'à récemment. Python 3.3 introduit Windows Python Launcher (py.exe et pyw.exe) qui lit la ligne #!, détecte les versions installées de Python et utilise les correctifs appropriés. voulait explicitement la version de Python. Comme l'extension peut être associée à un programme, vous pouvez obtenir le même comportement sous Windows qu'avec l'indicateur d'exécution sur les systèmes Unix.

8
pepr

Lorsque j’ai récemment installé Python 3.6.1 sur Windows 7, il a également installé le Python Launcher pour Windows, censé gérer la ligne Shebang. Cependant, j'ai constaté que le lanceur Python ne le faisait pas: la ligne Shebang était ignorée et le Python 2.7.13 était toujours utilisé (à moins que j'aie exécuté le script en utilisant py -3).

Pour résoudre ce problème, j'ai dû modifier la clé de registre Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\Shell\open\command. Cela avait toujours la valeur

"C:\Python27\python.exe" "%1" %*

de ma précédente installation Python 2.7. J'ai modifié cette valeur de clé de registre pour

"C:\Windows\py.exe" "%1" %*

et le traitement de la ligne Python Launcher Shebang a fonctionné comme décrit ci-dessus.

3
ETalbot

Réponse: uniquement si vous envisagez d'en faire un script exécutable en ligne de commande.

Voici la procédure:

Commencez par vérifier la chaîne Shebang appropriée à utiliser:

which python

Prenez le résultat et ajoutez-le (avec le Shebang #!) Dans la première ligne.

Sur mon système, il répond comme suit:

$which python
/usr/bin/python

Ainsi votre Shebang ressemblera à ceci:

#!/usr/bin/python

Après la sauvegarde, il fonctionnera toujours comme avant car python verra cette première ligne comme un commentaire.

python filename.py

Pour en faire une commande, copiez-la pour supprimer l’extension .py.

cp filename.py filename

Indiquez au système de fichiers qu'il sera exécutable:

chmod +x filename

Pour le tester, utilisez:

./filename

La meilleure pratique est de le déplacer quelque part dans votre $ PATH afin que tout ce que vous devez taper soit le nom du fichier lui-même.

Sudo cp filename /usr/sbin

De cette façon, cela fonctionnera partout (sans le ./ avant le nom du fichier)

0
SDsolar