Dois-je mettre #! (inclus) dans les scripts Python, et quelle forme doit-il prendre?
Dois-je l'inclus dans mes scripts Python? Sous quelle forme?
#!/usr/bin/env python
ou
#!/usr/local/bin/python
Sont ces tout aussi portable? Le formulaire qui est utilisé le plus?
Remarque: la tornade projet utilise le shebang. D'autre part, le Django le projet n'est pas.
- Le second n'est pas portable et échoue sur de nombreux ordinateurs, si pas plus.
- Comment
#!/usr/bin/python
comparer la première option? Je vois cela dans beaucoup de code en exemple. Edit: c'est Peut-être la réponse.. stackoverflow.com/a/2429517/1156245 - double possible de Pourquoi les gens écrivent #!/usr/bin/env python sur la première ligne d'un script Python?
- Je dis toujours l'utiliser, Pourquoi? "Le Zen De Python" - Ligne 2 - "Explicite est mieux qu'implicites." python.org/dev/peps/pep-0020
- Franchement, ce n'est pas "de droite", parce qu'en tant que l'auteur ne sait pas où la bonne version de Python sera lorsque le script est exécuté. Ce doit être le travail de l'installateur d'ajouter la bonne arborescence.
Vous devez vous connecter pour publier un commentaire.
La ligne shebang en aucun script détermine le script de la capacité d'être exécuté comme un exécutable autonome sans avoir à taper
python
à l'avance dans le terminal ou en double-cliquant dessus dans un gestionnaire de fichiers (lorsqu'il est configuré correctement). Il n'est pas nécessaire, mais en règle générale, il y a donc quand quelqu'un voit le fichier est ouvert dans un éditeur, ils ont immédiatement savoir ce qu'ils regardent. Cependant, qui ligne shebang vous utilisez EST important.Corriger utilisation pour Python 3 scripts:
Par défaut, c'est la version 3.plus tard. Pour Python 2.7.dernière utilisation
python2
en place depython3
.Suivantes ne doit PAS être utilisé (sauf pour les rares cas que vous écrivez du code qui est compatible avec Python 2.x et 3.x):
La raison de ces recommandations, compte tenu de PEP 394, c'est que
python
peut se référer soit àpython2
oupython3
sur des systèmes différents. Actuellement, il se réfère àpython2
sur la plupart des distributions, mais qui est susceptible de changer à un certain point.Aussi, NE PAS Utiliser:
--"#!/usr/bin/env python" vs "#!/usr/local/bin/python"
/usr/bin
alors comment pouvez-vous être certain queenv
sera trouvé dans/usr/bin
. Si python est installé dans un non-standard, alors cela veut probablement dire que python est installé dans une façon non standard et que le script doit échouer rapidement comme un résultat. Plutôt que de faire des hypothèses sur les propriétés de l'interpréteur python et en espérant pour le mieux./usr/bin/
, et son travail est de localiser les bacs (comme python) à l'aide dePATH
. Peu importe la façon python est installé, son chemin d'accès sera ajouté à cette variable, etenv
trouverez (si ce n'est, python n'est pas installé). C'est le travail deenv
, c'est l'ensemble de la raison pourquoi il existe. C'est la chose que les alertes de l'environnement (définir des variables d'environnement, y compris les chemins d'installation, et inclure des chemins d'accès). Les gens ont toujours compris que cette commande ne fonctionne que si il est toujours trouvé au même endroit. C'est juste une donnéeenv
a été égaré. D'autre part: il ne vous faudra pas longtemps pour découvrir que/usr/bin/python
,/bin/python
ou/usr/local/bin/python
sont loin d'être les seuls endroits où les gens d'installer python (par exemple:$HOME/bin/python
), il suffit de regarder combien de chemins d'accès que vous avez défini (echo $PATH
)env
faisait partie de la norme POSIX. Je pense queenv
n'a pas toujours été une partie de la norme POSIX, et j'ai donc été ploient sous très désuet des conseils.env
être dans/usr/bin/
/usr/bin/env
n'est pas garanti par aucune norme, autres que largement (universellement?) adopté à la règle...#!
ligne de le faire comme une extension à la norme POSIX. Cela n'empêche pas les gens d'assumer shebangs fonctionnera toujours, cependant./usr/bin/env
? Personnellement, c'est assez que/usr/bin/env
fonctionne sur n'importe quel système où python fonctionne (beau spectacle avec/usr/bin/env
est pris en charge sur Windows via pylauncher)#!
nienv
dans/usr/bin
sont spécifié par POSIX, mais ils sont tous les deux largement prise en charge de toute façon. Il doit être sûr de supposer que#!/usr/bin/env python
fonctionne même si le#!/usr/bin/env
choses n'est pas normalisé par la norme POSIX.python
exécutable lorsque le script est compatible avec Python 2 et Python 3. Sinon, il doit pointer vers le bon choix depython2
etpython3
.python
est python3env
: bugs.debian.org/cgi-bin/bugreport.cgi?bug=751817#10#!/usr/bin/env python
forme est bonne si vous souhaitez utiliser le parent de l'environnement des paramètres pour activerenv
de choisir le python. Si vous avez besoin d'un script pour utiliser un particulier python exécutable ou un environnement virtuel, vous devez placer son chemin d'accès dans l'arborescence.C'est vraiment juste une question de goût. Ajouter le shebang signifie que les gens peuvent appeler le script directement si ils veulent (en supposant que c'est marqué comme exécutable); omission cela signifie simplement
python
doit être lancé manuellement.Le résultat final de l'exécution du programme n'est pas affectée de toute façon, c'est juste les options de moyens.
chmod a+x [your-script].py
devrait le rendre exécutable et alors vous pouvez simplement appeler./[your-script.py]
dans le shell.if __name__ == "__main__":
est-ce?Mettre un beau spectacle dans un script Python pour indiquer:
python
exécutable explicitementSi vous écrivez un shebang manuellement puis utilisez toujours
#!/usr/bin/env python
, sauf si vous avez une raison particulière de ne pas l'utiliser. Cette forme est compris, même sur Windows (Python lanceur).Remarque: installé scripts doivent utiliser un exécutable python par exemple,
/usr/bin/python
ou/home/me/.virtualenvs/project/bin/python
. Il est dommage que certains outil des pauses si vous activez un virtualenv dans votre shell. Heureusement, la bonne arborescence est créée automatiquement dans la plupart des cas parsetuptools
ou votre package de distribution d'outils (sur Windows,setuptools
peut générer wrapper.exe
automatiquement les scripts).En d'autres termes, si le script est dans une source de la caisse, alors vous allez sûrement voir
#!/usr/bin/env python
. Si il est installé, puis le shebang est un chemin d'accès à un exécutable python comme#!/usr/local/bin/python
(NOTE: vous ne devriez pas écrire les chemins de la dernière catégorie manuellement).De choisir si vous devez utiliser
python
,python2
, oupython3
dans le shebang, voir PEP 394 - Le "python" de Commande sur les Systèmes de type Unix:#!/usr/bin/env python
lui-même?Si vous avez plus d'une version de Python et le script doit s'exécuter sous une version spécifique, elle-bang peut assurer le droit est utilisé lorsque le script est exécuté directement, par exemple:
Note le script pourrait encore être exécutées via une complète Python en ligne de commande, ou via l'importation, auquel cas la elle-bang est ignoré. Mais pour l'exécution des scripts directement, c'est un bon motif pour utiliser le she-bang.
#!/usr/bin/env python
est généralement la meilleure approche, mais cela aide à des cas particuliers.Habituellement, il serait préférable d'établir un Python environnement virtuel, auquel cas le générique
#!/usr/bin/env python
permettrait d'identifier la bonne instance de Python pour le virtualenv.which
vous donnera une chaîne de travail, période. Vous n'avez pas besoin de vous soucier de tous les tripes pour l'utiliser.Vous devez ajouter un shebang si le script est destiné à être exécutable. Vous devez également installer le script avec une installation d'un logiciel qui modifie le shebang à quelque chose de correct afin qu'il fonctionne sur la plate-forme cible. Des exemples de ce qui est distutils et de les Distribuer.
which
ira chercher automatiquement la valeur par défaut qui est utilisé par le système des commandes et de la ces. Il est générique et le système de bouvillons à la bonne installation.Le but de cette arborescence n'est pour le script de reconnaître l'interprète de type lorsque vous voulez exécuter le script à partir de la coquille.
Pour la plupart, et pas toujours, vous exécutez des scripts en fournissant l'interprète de l'extérieur.
Exemple d'utilisation:
python-x.x script.py
Cela fonctionne même si vous n'avez pas un beau spectacle de demande de déclaration.
Abord pourquoi l'un est plus "portable" c'est parce que,
/usr/bin/env
contient votrePATH
déclaration de comptes pour toutes les destinations où votre système de fichiers exécutables de résident.REMARQUE: une Tornade n'est pas strictement l'utilisation shebangs, et Django strictement ne l'est pas. Il varie avec la façon dont vous êtes l'exécution de votre fonction principale de l'application.
AUSSI: Il ne varie pas avec Python.
Parfois, si la réponse n'est pas très clair (je veux dire, vous ne pouvez pas décider si oui ou non), alors qu'il n'a pas trop d'importance, et vous pouvez ignorer le problème jusqu'à ce que la réponse est clair.
La
#!
seul but est de lancer le script. Django charge les sources sur son propre, et les utilise. Il n'a jamais besoin de décider ce que l'interprète doit être utilisé. De cette façon, le#!
en réalité n'a pas de sens ici.Généralement, si c'est un module et ne peut pas être utilisé comme un script, il n'est pas nécessaire pour l'utilisation de la
#!
. D'autre part, un module de source contient souventif __name__ == '__main__': ...
avec au moins certains trivial test de la fonctionnalité. Puis le#!
un sens nouveau.Une bonne raison pour l'utilisation de
#!
est lorsque vous utilisez Python 2 et Python 3 scripts -- ils doivent être interprétés par les différentes versions de Python. De cette façon, vous devez vous rappeler ce quepython
doit être utilisé lorsque le script se lance manuellement (sans le#!
à l'intérieur). Si vous avez un mélange de ces scripts, c'est une bonne idée d'utiliser le#!
à l'intérieur, les rendre exécutable et de le lancer comme des exécutables (chmod ...).Lors de l'utilisation de MS-Windows, la
#!
avait pas de sens -- jusqu'à récemment. Python 3.3 introduit un Windows Python Lanceur (py.exe et pyw.exe) qui lit le#!
ligne, détecte les versions installées de Python, et utilise la bonne ou explicitement voulu la version de Python. L'extension peut être associé à un programme, vous pouvez obtenir un comportement similaire dans Windows comme avec exécuter drapeau dans les systèmes de type Unix.Quand j'ai installé Python 3.6.1 sur Windows 7 récemment, elle a également installé le Python Lanceur d'applications pour Windows, qui est censé s'occuper de la ligne shebang. Cependant, j'ai trouvé que le Python Lanceur ne l'a pas fait: la ligne shebang a été ignorée et Python 2.7.13 a toujours été utilisée (sauf si j'ai exécuté le script à l'aide de py -3).
Pour résoudre ce problème, j'ai dû modifier la clé de registre de Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
. Cela avait encore de la valeurde mes plus tôt Python 2.7 installation. J'ai modifié cette valeur de clé de registre
et le Python Lanceur ligne shebang traitement a travaillé comme décrit ci-dessus.
Réponse: Uniquement si vous envisagez de faire une commande de ligne de script exécutable.
Voici la procédure:
Commencer par la vérification du bon shebang chaîne à utiliser:
Prendre la sortie de, et de les ajouter (avec le shebang #!) dans la première ligne.
Sur mon système, il répond comme suit:
De sorte que votre shebang ressemblera:
Après l'enregistrement, il continue à fonctionner comme avant car python verrez que la première ligne comme un commentaire.
Pour faire une commande, copie de baisser la .py extension.
Dire le système de fichiers que ce sera exécutable:
Pour le tester, utiliser:
La meilleure pratique est de déplacer quelque part dans votre $PATH de sorte que tous vous avez besoin de saisir le nom de fichier lui-même.
Que la façon de travailler partout (sans l' ./avant le nom de fichier)
Utilisation de la première
Cela vous donnera le résultat que l'endroit où mon interpréteur python (binaire) est présent.
Ce résultat peut être tout comme
ou
Maintenant bien sélectionner la ligne shebang et de l'utiliser.
De généraliser on peut utiliser:
ou
#!/usr/bin/env
fait le bon choix pour vous.which
de commande il sera de retour la chaîne correcte de votre système.which python
et de changer à nouveau le script si le résultat diffère de l'actuel shebang