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

10

Dependendo do sistema, python == python2 ou python == python3 .

Scripts executáveis em Python, iniciam com:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Para o python py3k, ele é fornecido na documentação que eu deveria / posso usar com o número da versão , então faço isso:

#!/usr/bin/env python3

Mas encontrei um problema com scripts py2k.

Enquanto em documentação do py2k está escrito para usar: #! /usr/bin/env python ,

em alguns * nix-es python py3k é o padrão, então python == python3. (Por exemplo, pacote python 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 como fazer pacotes de software que podem ser executados facilmente pelos usuários (sem modificar seu ambiente)

Posso fazer o mesmo truque para scripts python py2k quanto para scripts Python py3k e configurá-lo como: #!/usr/bin/env python2 ? Posso ter certeza de que cada distribuição py2k do python contém python2 file, então #!/usr/bin/env python2 funcionará?

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

    
por Grzegorz Wierzowiecki 11.12.2011 / 10:46

3 respostas

3

Um script pode verificar sua versão em Python e, se for o Python 3, reinicie-se usando o Python 2. Adicione o seguinte perto da 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 comando which do sistema para localizar python2 no PATH do ambiente. Em seguida, ele se relança com isso (ou aborta se não conseguir encontrá-lo).

Note que o script precisa ser uma sintaxe válida do Python 3 para ser iniciado no Python 3.

Além disso, qualquer saída deve ser liberada antes da chamada execv ou ela será perdida. Adicionar, por exemplo, sys.stdout.flush() pouco antes da chamada para execv liberar qualquer declaração print .

    
por 29.09.2014 / 16:05
1

Em versões mais antigas, pode haver apenas python em vez de python2 . Para tornar sua linha de sheebang mais clara, você poderia criar um link python2 -> python para poder usar #!/usr/bin/env python2 .

    
por 01.03.2013 / 12:38
1

Acho que o "padrão" está definido no link

This PEP provides a convention to ensure that Python scripts can continue to be portable across *nix systems, regardless of the default version of the Python interpreter (i.e. the version invoked by the python command).

  • python2 will refer to some version of Python 2.x.
  • python3 will refer to some version of Python 3.x.
  • for the time being, all distributions should ensure that python refers to the same target as python2.
  • however, end users should be aware that python refers to python3 on at least Arch Linux (that change is what prompted the creation of this PEP), so python should be used in the shebang line only for scripts that are source compatible with both Python 2 and 3.
  • in preparation for an eventual change in the default version of Python, Python 2 only scripts should either be updated to be source compatible with Python 3 or else to use python2 in the shebang line.
    
por 29.09.2014 / 17:18