web-dev-qa-db-fra.com

But de #!/Usr/bin/python3

Je l’ai remarqué dans quelques langages de script, mais dans cet exemple, j’utilise Python. Dans de nombreux tutoriels, ils commencent par #!/usr/bin/python3 sur la première ligne. Je ne comprends pas pourquoi nous avons cela.

  • Le système d'exploitation ne devrait-il pas savoir qu'il s'agit d'un script python (évidemment, il est installé car vous y faites référence)
  • Que se passe-t-il si l'utilisateur utilise un système d'exploitation qui n'est pas basé sur Unix?
  • La langue est installée dans un dossier différent pour une raison quelconque
  • L'utilisateur a une version différente. Surtout quand ce n'est pas un numéro de version complet (comme Python3 vs Python32)

Si quelque chose, je pourrais voir cela casser le script python en raison des raisons énumérées ci-dessus.

98
KayleL

#!/usr/bin/python3 est une ligne Shebang .

Une ligne Shebang définit l'emplacement de l'interprète. Dans ce cas, l'interprète python3 se trouve dans /usr/bin/python3. Une ligne Shebang peut également être un bash, Ruby, Perl ou tout autre interpréteur d'un langage de script, par exemple: #!/bin/bash

Sans la ligne Shebang, le système d'exploitation ne sait pas qu'il s'agit d'un script python, même si vous définissez l'indicateur d'exécution sur le script et l'exécutez comme suit: ./script.py. Pour que le script soit exécuté par défaut dans python3, appelez-le en tant que python3 script.py ou définissez la ligne Shebang.

Vous pouvez utiliser #!/usr/bin/env python3 pour la portabilité sur différents systèmes si l'interpréteur de langue est installé à différents emplacements.

160
Jin

Cela s'appelle un hasch-bang. Si vous exécutez le script à partir du shell, il inspectera la première ligne pour déterminer quel programme doit être lancé pour interpréter le script.

Un système d'exploitation non basé sur Unix utilisera ses propres règles pour déterminer comment exécuter le script. Windows par exemple utilisera l'extension de nom de fichier et le # fera en sorte que la première ligne soit traitée comme un commentaire.

Si le chemin d'accès à l'exécutable Python est incorrect, le script échouera naturellement. Il est facile de créer des liens vers l'exécutable réel à partir de n'importe quel emplacement spécifié par la convention standard.

16
Mark Ransom

Cette ligne aide à trouver le programme exécutable qui exécutera le script. Cette notation Shebang est assez standard dans la plupart des langages de script (du moins telle qu’elle est utilisée sur des systèmes d’exploitation adultes).

Un aspect important de cette ligne est la spécification de qui interprète sera utilisé. Sur de nombreuses distributions Linux axées sur le développement, par exemple, il est normal que plusieurs versions de python soient installées simultanément.

Python 2.x et Python 3 n'étant pas compatibles à 100%, cette différence peut être très importante. Donc, #! /usr/bin/python et #! /usr/bin/python3 ne sont pas identiques (et ni l'un ni l'autre sont exactement les mêmes que #! /usr/bin/env python3, comme indiqué ailleurs sur cette page.

10
zxq9
  1. Et cette ligne est comment .

  2. C'est ignoré.

  3. Son exécution échouera et devrait être modifiée pour pointer vers le bon emplacement. Ou env devrait être utilisé.

  4. Son exécution échouera probablement sous une version différente, quelle qu’elle soit.

En fait, il est très compliqué de déterminer quel type de fichier est un fichier. Le système d’exploitation ne peut donc plus le savoir. Il peut faire beaucoup de suppositions basées sur -

  • extension
  • UTI
  • MIME

Mais la ligne de commande ne dérange pas avec tout ça, car elle fonctionne sur un calque rétrocompatible, à partir du moment où ces absurdités fantaisistes ne voulaient rien dire. Si vous double-cliquez dessus avec certitude, un système d'exploitation moderne peut le déterminer, mais si vous l'exécutez à partir d'un terminal, alors non, car le terminal ne se soucie pas de vos API de typage de fichiers spécifiques au système d'exploitation.

En ce qui concerne les autres points. C'est une commodité, il est également possible de courir 

python3 path/to/your/script

Si votre python ne se trouve pas dans le chemin spécifié, cela ne fonctionnera pas, mais nous aurons tendance à installer des choses pour que de telles choses fonctionnent, et non l'inverse. Peu importe si vous êtes sous * nix, c'est à votre Shell de décider s'il convient de considérer cette ligne, car il s'agit d'une shellcode. Ainsi, par exemple, vous pouvez exécuter bash sous Windows.

En fait, vous pouvez supprimer cette ligne entièrement, cela signifie simplement que l'appelant devra spécifier un interprète. De même, ne placez pas vos interprètes dans des emplacements non standard et essayez ensuite d'appeler des scripts sans fournir d'interprète.

0
awiebe

Pour clarifier le fonctionnement de la ligne Shebang pour Windows, à partir du 3.7 Python doc :

  • Si la première ligne d'un fichier de script commence par # !, elle est appelée ligne «Shebang». Linux et les autres systèmes d'exploitation de type Unix prennent en charge de telles lignes de manière native et sont généralement utilisés sur ces systèmes pour indiquer comment un script doit être exécuté.
  • Le lanceur Python pour Windows permet d'utiliser les mêmes fonctionnalités avec les scripts Python sous Windows.
  • Pour permettre aux lignes Shebang des scripts Python d’être portables entre Unix et Windows, le programme de lancement prend en charge un certain nombre de commandes ‘virtuelles’ pour spécifier l’interpréteur à utiliser. Les commandes virtuelles prises en charge sont:
    • / usr/bin/env python
      • La forme/usr/bin/env de la ligne Shebang a une autre propriété spéciale. Avant de rechercher des interpréteurs Python installés, ce formulaire recherchera l'exécutable PATH à la recherche d'un exécutable Python. Cela correspond au comportement du programme env Unix, qui effectue une recherche PATH.
    • / usr/bin/python
    • / usr/local/bin/python
    • python
0
boardtc