web-dev-qa-db-fra.com

Pourquoi certains scripts python commencent-ils par #! / Usr / bin / env python?

J'ai remarqué que certains scripts python commencent par

#!/usr/bin/env python

au lieu de

#!/usr/bin/python

Les scripts python sont-ils les seuls à utiliser #!/usr/bin/env? Existe-t-il des scripts qui commencent par exemple avec #!/usr/bin/env bash ou #!/usr/bin/env Perl? Sinon, pourquoi les scripts python sont-ils différents?

38
Linux Jedi

Utiliser env dans le shebang d'un script

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

L'utilisation de #!/usr/bin/env python ou de #!/usr/bin/python joue un rôle si le script est exécutable et appelé sans la langue précédente. Le script appelle ensuite l'interprète de la langue pour exécuter le code à l'intérieur du script. Shebang est le "guide" permettant de rechercher, dans votre exemple, pythonname__.

Utiliser #!/usr/bin/env python au lieu de l'absolu (chemin complet) #!/usr/bin/python permet de s'assurer que python (ou l'interpréteur de toute autre langue) est trouvé, au cas où il ne se trouverait peut-être pas exactement au même endroit et à différentes distributions de type Linux ou Unix , comme expliqué par exemple ici .

Bien que #!/usr/bin/python fonctionne sur un système Ubuntu par défaut, il est donc recommandé d’utiliser plutôt #!/usr/bin/env python.

À propos de env

envest un exécutable dans /usr/bin, ou , comme indiqué par @hvd (merci pour l'indice!), disponible sous forme de lien symbolique de compatibilité dans /usr/bin vers envname__, dans pratiquement toutes les distributions Linux. .

De Wikipedia :


env est une commande Shell pour les systèmes d'exploitation Unix et de type Unix. Il est utilisé pour imprimer une liste de variables d'environnement ou exécuter un autre utilitaire dans un environnement modifié sans avoir à modifier l'environnement existant. En utilisant env, les 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. Les scripts Shell l'utilisent souvent pour lancer le bon interpréteur. Dans cette utilisation, l'environnement n'est généralement pas modifié


Vous trouverez plus d'informations sur envhere et, comme toujours, dans man env (depuis un terminal).


Informations complémentaires sur le Shebang; pourquoi #! python ne fonctionne pas?

Dans un commentaire, il a été demandé pourquoi nous ne pouvons pas simplement utiliser #!python en tant que Shebang. Puisque l'interprète est dans $PATH, l'idée est compréhensible.

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

Un script interpréteur est un fichier texte pour lequel l'autorisation d'exécution est activée et dont la première ligne est de la forme:

#! interpreter [optional-arg]

L'interpréteur doit être a chemin d'accès valide pour un exécutable ....

expliquez que execveexige un chemin complet (valide) vers l'interpréteur. Cela a du sens, car les scripts (dans n’importe quel langage) peuvent, par exemple, être exécuté à tout moment du démarrage également, éventuellement avant que $PATH ne soit défini.

50
Jacob Vlijm

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

Utiliser /usr/bin/env/ dans python sert encore un objectif. Comme python prend en charge environnements virtuelsEn utilisant /usr/bin/env python, vous vous assurerez que vos scripts s’exécutent dans l’environnement virtuel, le cas échéant. Alors que /usr/bin/python sera exécuté en dehors de l’environnement virtuel.

19
sid

En plus des réponses données ci-dessus, l'utilisation de /usr/bin/env permet à votre Python d'être installé à des emplacements non standard, et tant que votre PATH est configuré correctement, le script s'exécutera sans modification sous un système UNIX. système de style qui a /usr/bin/env. Cela inclut toutes les versions modernes de Linux et OS/X.

7
YitzikC