Pourquoi certains scripts python commencent par #! / usr / bin / env python? [dupliquer]

32

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 par #!/usr/bin/env bash ou #!/usr/bin/env perl ? Sinon, pourquoi les scripts python sont-ils différents?

    
posée Linux Jedi 03.01.2016 - 10:29
la source

3 réponses

43

Utiliser env dans le shebang d’un script

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

L’utilisation de #!/usr/bin/env python ou #!/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éteur du langage pour exécuter le code à l'intérieur du script, et le shebang est le "guide" pour trouver, dans votre exemple, python .

Utiliser #!/usr/bin/env python au lieu de l'absolu (chemin complet) #!/usr/bin/python s'assure que python (ou tout autre interpréteur de langage) est trouvé, au cas où il ne se trouverait pas exactement au même emplacement que Linux ou unix les distributions, comme expliqué par exemple ici .

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

À propos de env

env est un exécutable dans /usr/bin , ou , comme mentionné par @hvd (merci pour le conseil!), disponible en tant que lien symbolique de compatibilité dans /usr/bin à env , dans à peu près toutes les distributions Linux.

De Wikipedia :

env est une commande shell pour les systèmes d'exploitation de type Unix et 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, des variables peuvent être ajoutées ou supprimées et les variables existantes peuvent être modifiées en leur attribuant de nouvelles valeurs.

et en relation avec votre question:

En pratique, env a une autre utilisation courante. Il est souvent utilisé par les scripts shell pour lancer l’interpréteur correct. Dans cette utilisation, l'environnement n'est généralement pas modifié

Vous trouverez plus d'informations sur env ici et, comme toujours, dans man env (à partir d'un terminal).

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

Dans un commentaire, on nous demandait pourquoi nous ne pouvions pas simplement utiliser #!python comme un shebang. Puisque l'interprète est en $PATH , l'idée est compréhensible.

La raison en est qu'un exécutable est exécuté par execve , comme nous pouvons le lire ici . Spécifiquement les lignes:

Un script d’interpréteur est un fichier texte avec une autorisation d’exécution activée et dont la première ligne est de la forme:

#! interpreter [optional-arg]

L'interpréteur doit être un chemin d'accès 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é à tout moment pendant le démarrage aussi, peut-être avant que $PATH soit défini du tout.

    
réponse donnée Jacob Vlijm 03.01.2016 - 10:35
la source
15

La réponse de Jacob l’explique bien. Cependant, je voudrais mentionner un autre point.

Utiliser /usr/bin/env/ en python sert un autre objectif. Comme python prend en charge les environnements virtuels , l'utilisation de /usr/bin/env python garantira que vos scripts s'exécutent dans l'environnement virtuel, si vous en êtes à l'intérieur. Attendu que /usr/bin/python fonctionnera en dehors de l'environnement virtuel.

    
réponse donnée sid 03.01.2016 - 17:28
la source
6

Outre les réponses ci-dessus, l'utilisation de /usr/bin/env permet d'installer votre Python dans des emplacements non standard, et tant que votre PATH est configuré correctement, le script s'exécute sans aucune modification. Système de type UNIX avec /usr/bin/env . Cela inclut toute version moderne de Linux et OS / X.

    
réponse donnée YitzikC 03.01.2016 - 18:35
la source

Lire d'autres questions sur les étiquettes