python == python2 OU python == python3? Como empacotar, distribuir scripts python py2k?


10

Dependendo do sistema, python== python2ou 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 python2arquivo, então #!/usr/bin/env python2funcionará?

Se sim, por que não é proposto como padrão, por exemplo, na documentação python py2k ?


4
Tanto quanto eu sei, você sempre pode usá python2-lo para executá-lo (se instalado) e sempre pode verificar a versão python -V. se você quiser que pythonseja 2 ou 3, você deve rm /usr/bin/pythoncriar um link simbólico que aponte para sua versão desejada do python, por exemplo ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.

Obrigado por me garantir python2. Gostaria de saber por que não é padrão usá-lo quando há py2k e py3k e o padrão pythonpode 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.
Grzegorz Wierzowiecki

Creio que o que Hanan N. está tentando lhe dizer é que, se você estiver escrevendo código Python 2.x, use #!...python2em 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 uso python2.
Arcege 11/11/11

2
@Arcege Não tenho um python2executável no meu sistema (compressão Debian). pythoné um link simbólico para python2.6, e python3é um link simbólico para python3.1, mas não existe python2.
Gilles 'SO- stop be evil' (

Respostas:


3

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:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Isso usa o whichcomando do sistema para localizar python2no ambiente PATH. 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 execvchamada ou será perdida. Adicionar, por exemplo, sys.stdout.flush()pouco antes da chamada para execvliberará todas as printinstruções.


1

Nas versões mais antigas, pode haver apenas em pythonvez de python2. Para tornar sua linha de sheebang mais clara, você pode criar um link python2 -> pythonpara poder usá-lo #!/usr/bin/env python2.


No entanto, não resolve o problema declarado. Porque a questão é como fazer o seu roteiro bastante portátil, assim ele pode ser executado em todos os ambientes mencionados (com "python" "python2" etc)
Grzegorz Wierzowiecki

1

Eu acho que o "padrão" está definido em https://www.python.org/dev/peps/pep-0394/

Este PEP fornece uma convenção para garantir que os scripts Python possam continuar portáveis ​​nos sistemas * nix, independentemente da versão padrão do interpretador Python (ou seja, a versão invocada pelo comando python).

  • python2 irá se referir a alguma versão do Python 2.x.
  • python3 irá se referir a alguma versão do Python 3.x.
  • por enquanto, todas as distribuições devem garantir que python se refira ao mesmo destino que python2.
  • no entanto, os usuários finais devem estar cientes de que python se refere a python3 em pelo menos o Arch Linux (essa mudança foi o que levou à criação desse PEP); portanto, o python deve ser usado na linha shebang apenas para scripts compatíveis com o Python 2. e 3
  • na preparação para uma eventual alteração na versão padrão do Python, apenas os scripts do Python 2 devem ser atualizados para serem compatíveis com a fonte do Python 3 ou para usar o python2 na linha shebang.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.