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.
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."
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.
Dois-je mettre le Shebang dans mes scripts Python?
Mettez un Shebang dans un script Python pour indiquer:
python
exécutableSont-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.
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.
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.
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.
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.
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.
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)