Finalidade de #! / Usr / bin / python3

160

Eu notei isso em algumas linguagens de script, mas neste exemplo, estou usando python. Em muitos tutoriais, eles começariam #!/usr/bin/python3na primeira linha. Não entendo por que temos isso.

  • O sistema operacional não deveria saber que é um script python (obviamente está instalado desde que você está fazendo uma referência a ele)
  • E se o usuário estiver usando um sistema operacional que não seja baseado em unix
  • O idioma é instalado em uma pasta diferente por qualquer motivo
  • O usuário tem uma versão diferente. Especialmente quando não é um número de versão completo (como Python3 x Python32)

Se alguma coisa, eu pude ver isso quebrando o script python por causa dos motivos listados acima.

KayleL
fonte
9
Chego a essa pergunta apenas para copiar a string shebang.
Omerjerk 14/09/19

Respostas:

260

#!/usr/bin/python3é uma linha shebang .

Uma linha shebang define onde o intérprete está localizado. Nesse caso, o python3intérprete está localizado em /usr/bin/python3. A coisa toda linha também poderia ser uma bash, ruby, perlintérprete ou quaisquer outras linguagens de script, por exemplo: #!/bin/bash.

Sem a linha shebang, o sistema operacional não sabe que é um script python, mesmo se você definir o sinalizador de execução no script e executá-lo como ele ./script.py. Para executar o script por padrão em python3, chame-o como python3 script.pyou defina a linha shebang.

Você pode usar #!/usr/bin/env python3para portabilidade em diferentes sistemas, caso eles tenham o intérprete de idioma instalado em locais diferentes.

Jin
fonte
9
Então, #! /usr/bin/env python3deve ser escolhido #! /usr/bin/python3?
Winklerrr 13/09/19
4
@winklerrr Sim, é mais amplamente usado.
25419 MerreM
20

Isso é chamado de hash-bang. Se você executar o script a partir do shell, ele inspecionará a primeira linha para descobrir qual programa deve ser iniciado para interpretar o script.

Um sistema operacional não baseado em Unix utilizará suas próprias regras para descobrir como executar o script. O Windows, por exemplo, usará a extensão do nome do arquivo e #fará com que a primeira linha seja tratada como um comentário.

Se o caminho para o executável do Python estiver errado, naturalmente o script falhará. É fácil criar links para o executável real a partir de qualquer local especificado por convenção padrão.

Mark Ransom
fonte
12

Essa linha ajuda a encontrar o programa executável que executará o script. Essa notação shebang é bastante padrão na maioria das linguagens de script (pelo menos conforme usada em sistemas operacionais crescidos).

Um aspecto importante desta linha é especificar qual intérprete será usado. Em muitas distribuições Linux centradas no desenvolvimento, por exemplo, é normal ter várias versões do python instaladas ao mesmo tempo.

Python 2.xe Python 3 não são 100% compatíveis, portanto, essa diferença pode ser muito importante. Portanto, #! /usr/bin/pythone #! /usr/bin/python3não são os mesmos (e nem são os mesmos #! /usr/bin/env python3que os observados em outras partes desta página).

zxq9
fonte
6
  1. E essa linha é como .

  2. Isso é ignorado.

  3. Ele falhará na execução e deve ser alterado para apontar para o local apropriado. Ou envdeve ser usado.

  4. Ele falhará na execução e provavelmente falhará em uma versão diferente, independentemente.

Ignacio Vazquez-Abrams
fonte
3

Para esclarecer como a linha shebang funciona para janelas, no documento 3.7 Python :

  • Se a primeira linha de um arquivo de script começar com #!, É conhecida como linha "shebang". O Linux e outros sistemas operacionais semelhantes ao Unix têm suporte nativo para essas linhas e são comumente usados ​​nesses sistemas para indicar como um script deve ser executado.
  • O Python Launcher para Windows permite que os mesmos recursos sejam usados ​​com scripts Python no Windows
  • Para permitir que as linhas shebang nos scripts Python sejam portáveis ​​entre o Unix e o Windows, o iniciador suporta vários comandos 'virtuais' para especificar qual interpretador usar. Os comandos virtuais suportados são:
    • / usr / bin / env python
      • A forma / usr / bin / env da linha shebang possui mais uma propriedade especial. Antes de procurar intérpretes Python instalados, este formulário pesquisará no PATH executável um executável Python. Isso corresponde ao comportamento do programa env do Unix, que executa uma pesquisa PATH.
    • / usr / bin / python
    • / usr / local / bin / python
    • Pitão
boardtc
fonte
2

Na verdade, a determinação de que tipo de arquivo é muito complicado, agora o sistema operacional não pode saber. Pode fazer muitas suposições com base em -

  • extensão
  • UTI
  • MIME

Mas a linha de comando não se preocupa com tudo isso, porque é executada em uma camada compatível com versões anteriores limitada, a partir de quando esse absurdo sofisticado não significava nada. Se você clicar duas vezes com certeza, um sistema operacional moderno pode descobrir isso - mas se você o executar a partir de um terminal, então não, porque o terminal não se preocupa com o seu arquivo específico do SO sofisticado, digitando APIs.

Em relação aos outros pontos. É uma conveniência, é igualmente possível executar

python3 path/to/your/script

Se o seu python não estiver no caminho especificado, ele não funcionará, mas tendemos a instalar coisas para fazer coisas como esse funcionarem, e não o contrário. Na verdade, não importa se você está abaixo do * nix, cabe ao seu shell considerar essa linha porque é uma shellcode. Então, por exemplo, você pode executar bashno Windows.

Você pode realmente omitir essa linha completamente, apenas significa que o chamador terá que especificar um intérprete. Além disso, não coloque seus intérpretes em locais fora do padrão e tente chamar scripts sem fornecer um intérprete.

awiebe
fonte