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 ?

Grzegorz Wierzowiecki
fonte
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.

starfry
fonte
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.

DocSalvager
fonte
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.
StrongBad
fonte