57 votes

Pourquoi certains scripts Python commencent-ils par #!/usr/bin/env Python ?

J'ai remarqué que certains scripts Python débutent par

#!/usr/bin/env python

au lieu de

#!/usr/bin/python

Est-ce que les scripts Python sont les seuls à utiliser #!/usr/bin/env ? Y a-t-il des scripts qui commencent par exemple par #!/usr/bin/env bash o #!/usr/bin/env perl ? Si non, pourquoi les scripts Python sont-ils différents ?

70voto

Jacob Vlijm Points 78990

Utilisation de env dans le shebang d'un script.

Les scripts de Python ne sont pas différents des scripts de tout autre langage sur ce point.

Soit l'utilisation de #!/usr/bin/env python o #!/usr/bin/python joue un rôle si le script est exécutable et appelé sans la langue précédente. Le script appelle alors l'interprète du langage pour exécuter le code à l'intérieur du script, et le shebang est le "guide" à trouver, dans votre exemple, python .

Utilisation de #!/usr/bin/env python au lieu de l'absolu (chemin complet) #!/usr/bin/python s'assure que Python (ou l'interpréteur de tout autre langage) est trouvé, au cas où il ne serait pas exactement au même endroit dans différentes distributions Linux ou Unix, comme expliqué par exemple. ici .

Bien que #!/usr/bin/python fonctionnera sur un système Ubuntu par défaut, c'est donc une bonne pratique d'utiliser #!/usr/bin/env python à la place.

À propos d'env

env est un exécutable dans /usr/bin , o comme mentionné par @hvd (merci pour l'astuce !), disponible comme lien symbolique de compatibilité dans /usr/bin a env dans presque toutes les distributions Linux.

En Wikipedia :


env est une commande Shell pour les systèmes d'exploitation Unix et de type Unix. Elle est utilisée soit pour imprimer une liste de variables d'environnement, soit pour exécuter un autre utilitaire dans un environnement altéré sans avoir à modifier l'environnement actuellement existant. En utilisant env, des variables peuvent être ajoutées ou supprimées, et les variables existantes peuvent être modifiées en leur attribuant de nouvelles valeurs.

et par rapport à votre question :

En pratique, env a une autre utilisation courante. Il est souvent utilisé par Shell Shell pour lancer le bon interprète. Dans cet usage, l'environnement n'est typiquement pas modifié


En savoir plus env se trouve ici et, comme toujours, en man env (depuis un terminal).


Informations supplémentaires sur le shebang ; pourquoi #!Python ne fonctionne pas ?

Dans un commentaire, il a été demandé pourquoi nous ne pouvons pas simplement utiliser #!python comme un shebang. Puisque l'interpréteur est dans $PATH L'idée est compréhensible.

La raison en est qu'un exécutable est exécuté par execve comme on peut le lire ici . Plus précisément les lignes :

Un interprète script est un fichier texte dont la permission d'exécution est activée et dont la première ligne est de la forme :

#! interpreter [optional-arg]

L'interprète doit être un nom de chemin valide pour un exécutable....

expliquer que execve exige un chemin complet (valide) vers l'interpréteur. Cela a du sens, puisque les scripts (dans n'importe quelle langue) peuvent par exemple être exécutés à n'importe quel moment pendant le démarrage aussi, éventuellement avant que $PATH n'est pas défini du tout.

25voto

sid Points 251

La réponse de Jacob l'explique bien. Il y a cependant un autre point que je voudrais mentionner.

Utilisation de /usr/bin/env/ en Python sert un autre objectif. Comme Python supporte les environnements virtuels en utilisant /usr/bin/env python s'assurera que vos scripts s'exécutent à l'intérieur de l'environnement virtuel, si vous en faites partie. Alors que, /usr/bin/python s'exécutera en dehors de l'environnement virtuel.

8voto

Isac Casapu Points 181

En plus des réponses données ci-dessus, l'utilisation de /usr/bin/env permet à votre Python d'être installé dans des endroits non standard, et tant que votre PATH est configuré correctement, le script s'exécutera sans modification sur tout système de type UNIX qui a /usr/bin/env . Cela inclut toute version moderne de Linux et OS/X.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X