Objectif de #! / Usr / bin / python3

160

J'ai remarqué cela dans quelques langages de script, mais dans cet exemple, j'utilise python. Dans de nombreux didacticiels, ils commenceraient par #!/usr/bin/python3la première ligne. Je ne comprends pas pourquoi nous avons ça.

  • Le système d'exploitation ne devrait-il pas savoir que c'est un script python (il est évidemment installé puisque vous y faites référence)
  • Que faire 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 quoi que ce soit, je pourrais voir cela casser le script python pour les raisons énumérées ci-dessus.

KayleL
la source
stackoverflow.com/questions/2429511/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
9
Je viens à cette question juste pour copier la chaîne de shebang.
omerjerk le

Réponses:

260

#!/usr/bin/python3est une ligne de shebang .

Une ligne shebang définit où se trouve l'interprète. Dans ce cas, l' python3interprète se trouve dans /usr/bin/python3. La ligne A pourrait aussi être un bash, ruby, perlou tout autre interprète de langages 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 ./script.py. Pour que le script s'exécute par défaut dans python3, appelez-le en tant que python3 script.pyou définissez la ligne shebang.

Vous pouvez utiliser #!/usr/bin/env python3pour la portabilité entre différents systèmes au cas où l'interpréteur de langue serait installé à différents endroits.

Jin
la source
9
Alors #! /usr/bin/env python3devrait être choisi #! /usr/bin/python3?
winklerrr
4
@winklerrr Oui, c'est plus largement utilisé.
MerreM
20

Cela s'appelle un hash-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 #la première ligne sera 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.

Mark Ransom
la source
12

Cette ligne permet de trouver l'exécutable du programme qui exécutera le script. Cette notation shebang est assez standard dans la plupart des langages de script (du moins comme utilisé sur les systèmes d'exploitation adultes).

Un aspect important de cette ligne est de spécifier quel interpréteur sera utilisé. Sur de nombreuses distributions Linux centrées sur le développement, par exemple, il est normal que plusieurs versions de python soient installées en même temps.

Python 2.x et Python 3 ne sont pas compatibles à 100%, cette différence peut donc être très importante. Donc #! /usr/bin/pythonet #! /usr/bin/python3ne sont pas les mêmes (et ne sont pas tout à fait les mêmes que #! /usr/bin/env python3ceux indiqués ailleurs sur cette page.

zxq9
la source
6
  1. Et cette ligne est comment .

  2. Il est ignoré.

  3. Il ne fonctionnera pas et doit être modifié pour pointer vers l'emplacement approprié. Ou envdevrait être utilisé.

  4. Il ne fonctionnera pas et ne fonctionnera probablement pas sous une version différente.

Ignacio Vazquez-Abrams
la source
3

Pour clarifier le fonctionnement de la ligne shebang pour Windows, à partir de la documentation Python 3.7 :

  • Si la première ligne d'un fichier de script commence par # !, on parle de ligne «shebang». Linux et d'autres systèmes d'exploitation comme Unix ont un support natif pour ces lignes et ils sont couramment utilisés sur de tels 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 dans les scripts Python d'être portables entre Unix et Windows, le lanceur 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 les interpréteurs Python installés, ce formulaire recherchera dans l'exécutable PATH 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
boardtc
la source
2

En fait, la détermination de quel type de fichier un fichier est très compliquée, donc maintenant le système d'exploitation ne peut pas simplement le savoir. Il peut faire beaucoup de suppositions basées sur -

  • extension
  • UTI
  • MIME

Mais la ligne de commande ne se soucie pas de tout cela, car elle fonctionne sur une couche rétrocompatible limitée, à partir du moment où ce non-sens sophistiqué ne signifiait rien. Si vous double-cliquez dessus, bien sûr, un système d'exploitation moderne peut le comprendre - mais si vous l'exécutez à partir d'un terminal, non, car le terminal ne se soucie pas de vos API de saisie de fichiers spécifiques à votre système d'exploitation.

Concernant les autres points. C'est pratique, il est également possible d'exécuter

python3 path/to/your/script

Si votre python n'est pas dans le chemin spécifié, cela ne fonctionnera pas, mais nous avons tendance à installer des choses pour que des choses comme celles-ci fonctionnent, et non l'inverse. Peu importe que vous soyez sous * nix, c'est à votre shell de considérer ou non cette ligne car c'est un shellcode. Ainsi, par exemple, vous pouvez exécuter bashsous Windows.

Vous pouvez en fait ignorer complètement cette ligne, cela signifie simplement que l'appelant devra spécifier un interpréteur. Ne placez pas non plus vos interprètes dans des emplacements non standard, puis essayez d'appeler des scripts sans fournir d'interprète.

awiebe
la source