Dependendo do sistema, python
== python2
ou python
== python3
.
Scripts executáveis em Python, começa com:
#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...
Para python py3k, ele é fornecido na documentação. Devo / posso usá-lo com o número da versão ; portanto, faço isso:
#!/usr/bin/env python3
Mas eu encontrei um problema com scripts py2k.
Enquanto na documentação py2k está escrito para uso: #! /usr/bin/env python
,
em alguns * nix-es python py3k é o padrão, então python == python3. (Por exemplo , pacote python do ArchLinux , aqui arquivos do pacote python ).
Como empacotar (configurar, criar) e / ou preparar scripts python para distribuição para lidar com isso?
Eu pergunto sobre a criação de pacotes de software que podem ser executados facilmente pelos usuários (sem modificar o ambiente)
Posso fazer o mesmo truque para scripts python py2k e scripts python py3k e defini-lo como #!/usr/bin/env python2
:? Posso ter certeza de que cada distribuição python py2k contém python2
arquivo, então #!/usr/bin/env python2
funcionará?
Se sim, por que não é proposto como padrão, por exemplo, na documentação python py2k ?
fonte
python2
-lo para executá-lo (se instalado) e sempre pode verificar a versãopython -V
. se você quiser quepython
seja 2 ou 3, você deverm /usr/bin/python
criar um link simbólico que aponte para sua versão desejada do python, por exemploln -s /usr/bin/python2.5 /usr/bin/python
.python2
. Gostaria de saber por que não é padrão usá-lo quando há py2k e py3k e o padrãopython
pode ser diferente. E o seu conselho sobre a remoção - não é adequado a este exemplo, porque pergunto sobre a embalagem. Eu gostaria de fazer um pacote que possa ser executado em diferentes configurações / sistemas. Não há como modificar o ambiente. E quanto a verificação - não se aplica a Shebang - até onde eu sei.#!...python2
em seus programas e, se estiver usando Python 3.x, use#!...python3
. Não confie no sistema operacional para ter o link certo se você souber que ele funcionará apenas em uma versão específica. Eu trabalho com sistemas que ainda possuem o Python 1.5.2 instalado como/usr/bin/python
- ou escrevo código para lidar com versões mais antigas do Python ou usopython2
.python2
executável no meu sistema (compressão Debian).python
é um link simbólico parapython2.6
, epython3
é um link simbólico parapython3.1
, mas não existepython2
.Respostas:
Um script pode verificar sua versão do Python e, se for o Python 3, reiniciar-se usando o Python 2. Adicione o seguinte próximo à cabeça do script:
Isso usa o
which
comando do sistema para localizarpython2
no ambientePATH
. Em seguida, ele se reinicia com isso (ou aborta se não for possível encontrá-lo).Observe que o script precisa ser uma sintaxe válida do Python 3 para iniciar no Python 3.
Além disso, qualquer saída deve ser liberada antes da
execv
chamada ou será perdida. Adicionar, por exemplo,sys.stdout.flush()
pouco antes da chamada paraexecv
liberará todas asprint
instruções.fonte
Nas versões mais antigas, pode haver apenas em
python
vez depython2
. Para tornar sua linha de sheebang mais clara, você pode criar um linkpython2 -> python
para poder usá-lo#!/usr/bin/env python2
.fonte
Eu acho que o "padrão" está definido em https://www.python.org/dev/peps/pep-0394/
fonte