Question Dois-je mettre #! (shebang) dans les scripts Python, et quelle forme devrait-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: la tornade projet utilise le shebang. D'autre part, le Django projet ne fonctionne pas.


505
2017-08-02 06:35


origine


Réponses:


La ligne shebang dans n'importe quel script détermine la capacité du script à être exécuté comme un exécutable autonome sans avoir à taper python au préalable dans le terminal ou en double-cliquant dessus dans un gestionnaire de fichiers (si configuré correctement). Ce n'est pas nécessaire mais généralement mis là donc quand quelqu'un voit le fichier ouvert dans un éditeur, ils savent immédiatement ce qu'ils regardent. Cependant, quelle ligne shebang vous utilisez EST important.

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

#!/usr/bin/env python3

Cela par défaut à la version 3.latest. Pour Python 2.7.latest python2 au lieu de python3.

Le suivant NE devrait PAS être utilisé (sauf dans les rares cas où vous écrivez du code compatible avec Python 2.x et 3.x):

#!/usr/bin/env python

La raison de ces recommandations, donnée dans PEP 394, est-ce python peut se référer soit à python2 ou python3 sur différents systèmes. Il fait actuellement référence à python2 sur la plupart des distributions, mais cela risque 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   cas, le # ci-dessus! va échouer. "

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


705
2017-10-10 19:58



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

Le résultat final de l'exécution du programme n'est pas affecté d'une manière ou d'une autre; ce sont juste des options de moyens.


65
2017-08-02 06:39



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
  • s'il peut être exécuté uniquement sur python2, python3 ou est-il compatible Python 2/3
  • sur POSIX, il est nécessaire si vous voulez exécuter le script directement sans invoquer python exécutable explicitement

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

Si vous écrivez un shebang manuellement alors 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 sur Windows (lanceur Python).

Remarque: installée les scripts doivent utiliser un exécutable python spécifique, par exemple, /usr/bin/python ou /home/me/.virtualenvs/project/bin/python. C'est mauvais si un outil se casse 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 distribution (sous Windows, setuptools peut générer un wrapper .exe scripts automatiquement).

En d'autres termes, si le script est dans une caisse source alors vous verrez probablement #!/usr/bin/env python. S'il est installé alors le shebang est un chemin vers un exécutable python spécifique tel que #!/usr/local/bin/python(NOTE: vous ne devriez pas écrire manuellement les chemins de cette dernière catégorie).

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

  • ... python devrait être utilisé dans la ligne shebang seulement pour les scripts qui sont   source compatible avec Python 2 et 3.

  • en préparation pour un changement éventuel de la version par défaut de   Python, Python 2 seuls les scripts doivent être mis à jour pour être source   compatible avec Python 3 ou à utiliser python2 dans la ligne Shebang.


19
2017-08-12 01:58



Si vous avez plusieurs versions de Python et que le script doit s'exécuter sous une version spécifique, le she-bang peut garantir que le bon est utilisé lorsque le script est exécuté directement, par exemple:

#!/usr/bin/python2.7

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

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

Habituellement, il serait préférable d'établir un environnement virtuel Python, auquel cas le générique #!/usr/bin/env python identifierait l'instance correcte de Python pour virtualenv.


14
2017-08-10 18:57



Vous devriez ajouter un shebang si le script est destiné à être exécutable. Vous devriez également installer le script avec un logiciel d'installation qui modifie le shebang à quelque chose de correct afin qu'il fonctionne sur la plate-forme cible. Des exemples de ceci sont distutils et Distribute.


10
2017-08-02 07:42



Le but de shebang est que le script reconnaisse le type d'interpréteur 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éteur à l'extérieur. Exemple d'utilisation: python-x.x script.py

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

Pourquoi le premier est plus "portable" est parce que, /usr/bin/env contient votre PATH déclaration qui représente toutes les destinations où résident les exécutables de votre système.

NOTE: Tornado n'utilise pas strictement les shebangs, et Django ne les utilise strictement pas. Cela dépend de la façon dont vous exécutez la fonction principale de votre application.

AUSSI: Il ne varie pas avec Python.


8
2017-08-02 06:45



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 ce n'est pas grave, et vous pouvez ignorer le problème jusqu'à la réponse est clair.

le #! le seul but est de lancer le script. Django charge lui-même les sources et les utilise. Il n'a jamais besoin de décider quel interprète doit être utilisé. De cette façon, le #! n'a en fait aucun sens ici.

Généralement, s'il s'agit d'un module et ne peut pas être utilisé comme script, il n'est pas nécessaire d'utiliser le #!. D'un autre côté, une source de module contient souvent if __name__ == '__main__': ... avec au moins quelques tests triviaux de la fonctionnalité. Puis le #! a encore du sens.

Une bonne raison d'utiliser #! Lorsque vous utilisez des 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 pythondoit ê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, rendez-les exécutables, et lancez-les en tant qu'exécutables (chmod ...).

Lorsque vous utilisez MS-Windows, le #! n'avait pas de sens - jusqu'à récemment. Python 3.3 introduit un Windows Python Launcher (py.exe et pyw.exe) qui lit le #! line, détecte les versions installées de Python, et utilise la version correcte ou explicitement voulue de Python. Comme l'extension peut être associée à un programme, vous pouvez obtenir un comportement similaire dans Windows comme avec l'indicateur d'exécution dans les systèmes basés sur Unix.


7
2018-01-30 07:52



Réponse: Seulement 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 de caractères 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 ça:

$which python
/usr/bin/python

Donc, votre shebang ressemblera à:

#!/usr/bin/python

Après avoir sauvegardé, 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

Dites au système de fichiers que ce sera exécutable:

chmod +x filename

Pour le tester, utilisez:

./filename

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

sudo cp filename /usr/sbin

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


3
2018-01-22 04:05