Pergunta

No início de todos os meus executável do Python scripts que eu colocar o shebang linha:

#!/usr/bin/env python

Eu estou correndo estes scripts em um sistema onde env python produz um Python 2.2 meio ambiente.Meus scripts rapidamente falhar porque eu tenho uma verificação manual para um compatível versão do Python:

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

Eu não quero ter que alterar a linha de shebang em cada arquivo executável, se é possível;no entanto, eu não tenho acesso administrativo ao computador para alterar o resultado de env python e eu não quero forçar uma versão em particular, como em:

#!/usr/bin/env python2.4

Eu gostaria de evitar isso porque o sistema pode ter uma versão mais recente do que o Python 2.4, ou pode ter o Python 2.5, mas não o Python 2.4.

Qual é a solução elegante?

[Edit:] eu não era específico o suficiente em fazer a pergunta-eu gostaria de permitir que os usuários de executar os scripts sem manual de configuração (por exemplo,caminho alteração ou simbolicamente, em ~/bin e assegurar o seu CAMINHO tem ~/bin antes de Python 2.2 caminho).Talvez alguns concessionária de distribuição é necessário para evitar que o manual de ajustes?

Foi útil?

Solução

"env" simplesmente executa a primeira coisa que ele encontra no CAMINHO var env.Para mudar para diferentes python, preceder o diretório para o executável do python para o caminho antes de invocar o script.

Outras dicas

Muito hackish solução - se a sua verificação falhar, use esta função (o que provavelmente poderia ser significativamente melhorados) para determinar o melhor intérprete, determinar se ele é aceitável, e, se para relançar seu script com o os.sistema ou algo semelhante e o seu sys.argv usando o novo intérprete.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

Se você estiver executando os scripts em seguida, você pode definir a variável PATH para apontar para um privado bin primeiro:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

Em seguida, quando você executar seu script python que vai usar o python 2.4.Você terá de alterar os scripts de logon para alterar o seu CAMINHO.

Em alternativa, execute o script em python com o explícito interpretador que você deseja:

$ /path/to/python2.4 <your script>

@morais:Que é uma idéia interessante, mas eu acho que talvez possamos dar um passo mais longe.Talvez haja uma maneira de usar Ian Bicking do virtualenv para:

  • Veja se estamos executando em um ambiente adequado, para começar, e se assim for, não fazer nada.
  • Verifique se existe uma versão executável específico sobre o PATH, i.é.verifique se python2.x existe for x in reverse(range(4, 10)).Se assim for, volte a executar o comando com o melhor intérprete.
  • Se não é melhor intérprete de existir, use a virtualenv para tentar instalar uma versão mais recente do Python, a partir da mais antiga versão do Python e obter todos os pacotes de pré-requisito.

Eu não tenho idéia se virtualenv é capaz de fazer isso, então eu vou mexer com ele em breve.:)

Aqui está uma solução se você estiver (1) absolutamente utilizando shebangs e (2) capaz de usar autotools da em seu processo de criação.

Eu só encontrado na noite passada que você pode usar o autoconf macro AM_PATH_PYTHON para encontrar um mínimo de Python 2 binário.Como é aqui.

Assim, o processo seria:

  • Um problema AM_PATH_PYTHON(2.4) em seu configure.ac
  • Mudar o nome de todos os seus .py scripts para .py.in (na minha experiência, isso não confundir vi)
  • Nome de todos os scripts em Python pretende gerar com AC_CONFIG_FILES.
  • Em vez de começar com #!/usr/bin/env python, uso #!@PYTHON@

Em seguida, o seu resultante Scripts em Python, vai ter sempre um apropriado shebang.

Então, você tem essa solução, pelo menos possível, se não prático.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top