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: leprojet de tornade utilise le shebang. En revanche, leprojet Django ne le fait pas.
python
shell
python-3.x
shebang
treecoder
la source
la source
#!/usr/bin/python
compare-t-il à la première option? Je vois cela dans beaucoup d'exemples de code. Edit: Peut-être que c'est la réponse .. stackoverflow.com/a/2429517/1156245Ré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 (lorsqu'il est 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, il sait immédiatement ce qu'il regarde. Cependant, quelle ligne de shebang vous utilisez est importante.L' utilisation correcte des scripts Python 3 est:
Cette valeur par défaut est la version 3.latest. Pour Python 2.7.dernière utilisation
python2
à la place depython3
.Les éléments suivants ne doivent PAS être utilisés (sauf dans les rares cas où vous écrivez du code compatible avec Python 2.x et 3.x):
La raison de ces recommandations, données dans le PEP 394 , est qu'elles
python
peuvent se référer àpython2
oupython3
sur différents systèmes. Il fait actuellement référence à lapython2
plupart des distributions, mais cela est susceptible de changer à un moment donné.N'utilisez PAS non plus:
- "#! / usr / bin / env python" vs "#! / usr / local / bin / python"
la source
/usr/bin
alors comment pouvez-vous être certain qu'ilenv
sera trouvé dans/usr/bin
. Si python est installé dans un emplacement non standard, cela signifie probablement que python est configuré de manière non standard et que le script devrait en conséquence échouer rapidement. Par opposition à faire des hypothèses sur les propriétés de l'interpréteur python et à espérer le meilleur.env
sera toujours trouvé dans/usr/bin/
, et son travail consiste à localiser les bacs (comme python) à l'aidePATH
. Peu importe la façon dont python est installé, son chemin sera ajouté à cette variable etenv
le trouvera (sinon, python n'est pas installé). C'est le travail deenv
, c'est la raison pour laquelle cela existe. C'est la chose qui alerte l'environnement (configurez les variables env, y compris les chemins d'installation et incluez les chemins). Les gens ont toujours compris que cette commande ne peut fonctionner que si elle se trouve toujours au même endroit. C'est juste une/usr/bin/env
n'est garanti par aucune norme, à part une règle largement (universellement?) Adoptée ...python
exécutable que lorsque le script est compatible avec Python 2 et Python 3. Sinon, il devrait pointer vers le choix approprié parmipython2
etpython3
.C'est vraiment juste une question de goût. L'ajout du shebang signifie que les gens peuvent invoquer le script directement s'ils le souhaitent (en supposant qu'il est marqué comme exécutable); son omission signifie simplement qu'elle
python
doit être invoquée 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.
la source
chmod a+x [your-script].py
devrait le rendre exécutable et ensuite vous pouvez simplement appeler./[your-script.py]
en shell.Mettez un shebang dans un script Python pour indiquer:
python
explicitement l'exécutableSi 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 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 shebang correct est créé automatiquement dans la plupart des cas parsetuptools
ou vos outils de package de distribution (sous Windows,setuptools
peuvent générer.exe
automatiquement des scripts wrapper ).En d'autres termes, si le script est dans une extraction de source, vous le verrez probablement
#!/usr/bin/env python
. S'il est installé, le shebang est un chemin vers un exécutable python spécifique tel que#!/usr/local/bin/python
(REMARQUE: vous ne devez pas écrire les chemins de cette dernière catégorie manuellement).Pour choisir si vous devez utiliser
python
,python2
oupython3
dans le shebang, voir PEP 394 - La commande "python" sur les systèmes de type Unix :la source
#!/usr/bin/env python
lui-même?#!/usr/bin/env python
. Veuillez ne pas suggérer de "toujours utiliser"#!/usr/bin/env python
. Ce n'est pas la bonne chose à faire dans 99% des cas (la raison que vous avez indiquée dans votre réponse).Si vous avez plus d'une version de Python et que le script doit s'exécuter sous une version spécifique, la she-bang peut garantir que la bonne est utilisée lorsque le script est exécuté directement, par exemple:
Notez que le script peut toujours être exécuté via une ligne de commande Python complète, ou via l'importation, auquel cas le she-bang est ignoré. Mais pour les scripts exécutés directement, c'est une raison décente d'utiliser le she-bang.
#!/usr/bin/env python
est généralement la meilleure approche, mais cela aide dans 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.la source
which
vous donneront une chaîne qui fonctionnera, point final. Vous n'avez pas à vous soucier des tripes pour l'utiliser.Vous devez ajouter un shebang si le script est destiné à être exécutable. Vous devez également installer le script avec un logiciel d'installation qui modifie le shebang en quelque chose de correct afin qu'il fonctionne sur la plate-forme cible. Distutils et Distribute en sont des exemples.
la source
which
sélectionnera automatiquement la valeur par défaut utilisée par les commandes système et autres. Il est générique et le système le dirige vers l'installation appropriée.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 en externe. 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" parce qu'il
/usr/bin/env
contient votrePATH
déclaration qui représente toutes les destinations où résident les exécutables de votre système.REMARQUE: Tornado n'utilise pas strictement les shebangs, et Django ne le fait pas strictement. Cela varie selon la façon dont vous exécutez la fonction principale de votre application.
AUSSI: Cela ne varie pas avec Python.
la source
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 pas trop d'importance et vous pouvez ignorer le problème jusqu'à ce que la réponse soit claire.
Le
#!
seul but est de lancer le script. Django charge les sources par lui-même et les utilise. Il n'a jamais besoin de décider quel interprète doit être utilisé. De cette façon, le#!
fait n'a aucun sens ici.En général, 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 souventif __name__ == '__main__': ...
avec au moins quelques tests triviaux de la fonctionnalité. Ensuite, le#!
sens à nouveau.Une bonne raison d'utiliser
#!
est lorsque vous utilisez à la fois 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 quipython
doit être utilisé lors du lancement manuel du script (sans l'#!
intérieur). Si vous avez un mélange de ces scripts, c'est une bonne idée d'utiliser l'#!
intérieur, de les rendre exécutables et de les lancer en tant qu'exécutables (chmod ...).Lors de l'utilisation de MS-Windows, cela
#!
n'avait aucun sens - jusqu'à récemment. Python 3.3 présente un lanceur Windows Python (py.exe et pyw.exe) qui lit la#!
ligne, détecte les versions installées de Python et utilise la version correcte ou explicitement souhaitée 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.la source
Lorsque j'ai installé Python 3.6.1 sur Windows 7 récemment, il a également installé le lanceur Python pour Windows, qui est censé gérer la ligne shebang. Cependant, j'ai trouvé que le lanceur Python ne faisait pas cela: la ligne shebang était ignorée et Python 2.7.13 était toujours utilisé (à moins que j'exécute 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 encore de la valeurde ma précédente installation Python 2.7. J'ai modifié cette valeur de clé de registre en
et le traitement de ligne de shebang Python Launcher a fonctionné comme décrit ci-dessus.
la source
Si vous avez différents modules installés et devez utiliser une installation spécifique de python, alors shebang semble être limité au début. Cependant, vous pouvez faire des astuces comme ci-dessous pour permettre au shebang d'être appelé d'abord en tant que script shell, puis de choisir python. C'est imo très flexible:
Ou mieux encore, peut-être, pour faciliter la réutilisation du code sur plusieurs scripts python:
puis select.sh a:
la source
Réponse: uniquement si vous prévoyez d'en faire un script exécutable en ligne de commande.
Voici la procédure:
Commencez par vérifier la chaîne de shebang appropriée à utiliser:
Prenez la sortie de cela et ajoutez-la (avec le shebang #!) Dans la première ligne.
Sur mon système, il répond comme suit:
Votre shebang ressemblera donc à:
Après l'enregistrement, il fonctionnera comme avant car python verra cette première ligne comme un commentaire.
Pour en faire une commande, copiez-la pour supprimer l'extension .py.
Dites au système de fichiers que ce sera exécutable:
Pour le tester, utilisez:
La meilleure pratique consiste à le déplacer quelque part dans votre $ PATH afin que vous n'ayez qu'à taper le nom du fichier lui-même.
De cette façon, cela fonctionnera partout (sans le ./ avant le nom de fichier)
la source
Chemin absolu vs chemin logique:
C'est vraiment une question de savoir si le chemin vers l'interpréteur Python doit être absolu ou Logical (
/usr/bin/env
) en ce qui concerne la portabilité.Rencontrant d'autres réponses sur ce site et sur d'autres sites Stack qui ont parlé du problème de manière générale sans prendre en charge les preuves, j'ai effectué des tests et des analyses vraiment, vraiment , granulaires sur cette même question sur le unix.stackexchange.com . Plutôt que de coller cette réponse ici, je vais diriger les personnes intéressées par l'analyse comparative vers cette réponse:
https://unix.stackexchange.com/a/566019/334294
En tant qu'ingénieur Linux, mon objectif est toujours de fournir les hôtes les plus adaptés et optimisés pour mes clients développeurs, donc la question des environnements Python était quelque chose pour laquelle j'avais vraiment besoin d'une réponse solide. Mon avis après le test était que le chemin logique de la transe était la meilleure des (2) options.
la source
Utiliser d'abord
Cela donnera la sortie comme l'emplacement où mon interprète python (binaire) est présent.
Cette sortie pourrait être telle que
ou
Maintenant, sélectionnez correctement la ligne de shebang et utilisez-la.
Pour généraliser, nous pouvons utiliser:
ou
la source
#!/usr/bin/env
fait le bon choix pour vous.which
commande - elle renverra la chaîne correcte pour votre système particulier.which python
et modifiez le script si la sortie diffère du shebang actuel