1216 votes

Pourquoi les gens écrivent-ils #!/usr/bin/env python sur la première ligne d'un script Python ?

Je vois ceci en haut des fichiers Python :

  1. Pour les fichiers Python 2

    #!/usr/bin/env python
  2. Pour les fichiers Python 3

    #!/usr/bin/env python3

Il me semble que les fichiers fonctionnent de la même manière sans cette ligne.

1 votes

La réponse ci-dessous indique qu'il s'agit simplement d'une ligne de commentaires. Ce n'est pas toujours le cas. J'ai un "Hello, World !" CGI script(.py) qui ne s'exécutera et n'affichera la page web qu'avec #!/usr/bin/env python en haut.

2 votes

0 votes

Ils peuvent fonctionner, mais pas dans l'environnement prévu.

1190voto

Alex Martelli Points 330805

Si vous avez plusieurs versions de Python installées, /usr/bin/env s'assurera que l'interpréteur utilisé est le premier sur la liste de l'environnement $PATH . L'alternative serait de coder en dur quelque chose comme #!/usr/bin/python ; c'est correct, mais moins flexible.

Dans Unix, un exécutable qui est destiné à être interprété peut indiquer quel interpréteur utiliser en ayant une balise #! au début de la première ligne, suivi de l'interpréteur (et de tous les drapeaux dont il peut avoir besoin).

Si vous parlez d'autres plates-formes, bien sûr, cette règle ne s'applique pas (mais cette "ligne shebang" ne fait pas de mal, et sera utile si jamais vous copiez ce script sur une plate-forme. avec une base Unix, comme Linux, Mac, etc).

308 votes

Juste pour ajouter : ceci s'applique lorsque vous l'exécutez sous Unix en le rendant exécutable ( chmod +x myscript.py ) et de l'exécuter directement : ./myscript.py plutôt que de simplement python myscript.py .

30 votes

En utilisant env offre une flexibilité maximale dans la mesure où l'utilisateur peut choisir l'interprète à utiliser en modifiant le PATH. Souvent, cette flexibilité n'est pas nécessaire et l'inconvénient est que linux, par exemple, ne peut pas utiliser le nom script pour le nom du processus dans le fichier ps et revient à "python". Lorsque vous empaquetez des applications python pour des distros par exemple, je vous conseille de ne pas utiliser env .

10 votes

py lanceur peut utiliser la ligne shebang sous Windows. Elle est incluse dans Python 3.3 ou il peut être installé indépendamment .

292voto

Sinan Ünür Points 76179

C'est ce qu'on appelle le ligne shebang . Comme le L'entrée de Wikipedia explique :

En informatique, un shebang (également appelé hashbang, hashpling, pound bang ou crunchbang) désigne les caractères "# !" lorsqu'ils sont les deux premiers caractères d'une directive d'interpréteur comme première ligne d'un fichier texte. Dans un système d'exploitation de type Unix, le chargeur de programme prend la présence de ces deux caractères comme une indication que le fichier est un script, et essaie d'exécuter ce script en utilisant l'interpréteur spécifié par le reste de la première ligne du fichier.

Voir également le Entrée de la FAQ Unix .

Même sous Windows, où la ligne shebang ne détermine pas l'interpréteur à exécuter, vous pouvez passer des options à l'interpréteur en les spécifiant sur la ligne shebang. Je trouve utile de garder une ligne shebang générique dans les scripts ponctuels (comme ceux que j'écris lorsque je réponds à des questions sur SO), afin de pouvoir les tester rapidement à la fois sur Windows et sur ArchLinux .

El env. utilitaire permet d'invoquer une commande sur le chemin :

Le premier argument restant spécifie le nom du programme à invoquer ; il est recherché en fonction de l'option PATH variable d'environnement. Tous les arguments restants sont passés comme arguments à ce programme.

1 votes

@Arafangion vous trouverez probablement cette question utile. TL;DR : symbolhound.com

2 votes

"Même sous Windows, où la ligne shebang ne détermine pas l'interprète à exécuter, vous pouvez passer des options à l'interprète en les spécifiant sur la ligne shebang." C'est tout simplement faux ; si une telle chose se produit, c'est parce que l'interpréteur lui-même traite la ligne shebang. Si l'interpréteur n'a pas de reconnaissance spéciale pour les lignes shebang, alors rien de tel ne se produit. Windows ne fait rien avec les lignes shebang". Ce que vous décrivez peut-être dans ce cas est le lanceur de python : python.org/dev/peps/pep-0397 .

0 votes

Windows n'a aucune disposition pour rendre un fichier ".py" exécutable. Les fichiers Python semblent exécutables à partir de l'interpréteur de commandes de l'explorateur via une association de l'attribut .py comme un document pour une application. Si cette application est le pylauncher spécifique à Python, alors vous obtenez le traitement du hash bang. C'est tout.

163voto

Ned Deily Points 40248

En développant un peu les autres réponses, voici un petit exemple de la façon dont votre ligne de commande scripts peut se mettre en difficulté par une utilisation imprudente de /usr/bin/env les lignes du shebang :

$ /usr/local/bin/python -V
Python 2.6.4
$ /usr/bin/python -V
Python 2.5.1
$ cat my_script.py 
#!/usr/bin/env python
import json
print "hello, json"
$ PATH=/usr/local/bin:/usr/bin
$ ./my_script.py 
hello, json
$ PATH=/usr/bin:/usr/local/bin
$ ./my_script.py 
Traceback (most recent call last):
  File "./my_script.py", line 2, in <module>
    import json
ImportError: No module named json

Le module json n'existe pas dans Python 2.5.

Une façon de se prémunir contre ce genre de problème est d'utiliser les noms de commandes python versionnés qui sont généralement installés avec la plupart des Python :

$ cat my_script.py 
#!/usr/bin/env python2.6
import json
print "hello, json"

Si vous avez simplement besoin de faire la distinction entre Python 2.x et Python 3.x, les versions récentes de Python 3 fournissent également une fonction python3 nom :

$ cat my_script.py 
#!/usr/bin/env python3
import json
print("hello, json")

28 votes

Hmm, ce n'est pas ce que j'ai compris de ce post.

1 votes

Différence entre local et global. Si which python renvoie à /usr/bin/python le chemin d'un répertoire local peut être codé en dur : #!/usr/bin/python . Mais c'est moins flexible que #!/usr/bin/env python qui a une application mondiale.

91voto

Rose Perrone Points 14478

Afin d'exécuter le script de python, nous devons dire trois choses au shell :

  1. Que le fichier est un script.
  2. Quel interpréteur nous voulons pour exécuter le script.
  3. Le chemin dudit interprète

L'ensemble #! accomplit (1.). Le tout commence par un # parce que le # est un marqueur de commentaire dans de nombreux langages de script. Le contenu de la ligne shebang est donc automatiquement ignoré par l'interpréteur.

El env permet de réaliser (2.) et (3.). Pour citation "grawity,"

Une utilisation courante de la env est de lancer les interprètes, en faisant en profitant du fait que env cherchera dans $PATH la commande qu'on lui demande de de lancer. Puisque la ligne shebang requiert la spécification d'un chemin absolu absolu, et que l'emplacement des différents interpréteurs (perl, bash, python) peut varier beaucoup, il est courant d'utiliser :

#!/usr/bin/env perl   au lieu d'essayer de deviner si c'est /bin/perl, /usr/bin/perl, /usr/local/bin/perl, /usr/local/pkg/perl, /fileserver/usr/bin/perl, ou /home/MrDaniel/usr/bin/perl sur le système de l'utilisateur de l'utilisateur...

D'un autre côté, env est presque toujours dans /usr/bin/env (sauf dans les cas où il ne l'est pas. cas où il ne l'est pas ; certains systèmes peuvent utiliser /bin/env, mais c'est une assez rare et n'arrive que sur les systèmes non-Linux).

1 votes

"grawity" où ?

41voto

La principale raison de faire cela est de rendre le script portable à travers les environnements de système d'exploitation.

Par exemple sous mingw, python scripts utiliser :

#!/c/python3k/python 

et sous la distribution GNU/Linux c'est soit :

#!/usr/local/bin/python 

ou

#!/usr/bin/python

et sous le meilleur système commercial Unix sw/hw de tous (OS/X), il l'est :

#!/Applications/MacPython 2.5/python

ou sur FreeBSD :

#!/usr/local/bin/python

Cependant toutes ces différences peuvent rendre le script portable à travers tous en utilisant :

#!/usr/bin/env python

2 votes

Sous MacOSX, il est également /usr/bin/python . Sous Linux, le Python installé par le système est aussi très certainement /usr/bin/python (Je n'ai jamais vu autre chose et cela n'aurait aucun sens). Notez qu'il peut y avoir des systèmes qui ne disposent pas de /usr/bin/env .

2 votes

Si vous êtes sous OSX, que vous utilisez Homebrew et que vous suivez les instructions d'installation par défaut, il sera sous #!/usr/local/bin/python.

0 votes

Mise à jour pour l'année 2018 : Bare python n'est pas si portable, c'est l'interpréteur Python par défaut de la distribution. Arch Linux utilise Python 3 par défaut depuis longtemps et d'autres distributions y pensent également car Python 2 n'est supporté que jusqu'en 2020.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X