Qual é a maneira correta de gerenciar várias versões python?

21

Eu tenho uma máquina com o Python 2.6 instalado como o Python padrão. Em seguida, instalei o Python 2.7 e criei manualmente / usr / bin / python como um link simbólico para a nova instalação.

Então, eu estava tendo problemas com o comando não encontrado . Estou tentando reinstalá-lo:

sudo apt-get remove command-not-found

e recebo este erro:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Mas eu realmente quero que o Python 2.7 seja o padrão. Como faço para corrigir essa bagunça?

ripper234
fonte

Respostas:

16

Alterar o Python padrão (ou Perl, etc) em um sistema operacional é uma péssima idéia. Na verdade, esse intérprete faz parte do sistema operacional e pode haver outros componentes do sistema operacional criados especificamente para trabalhar com essa versão do intérprete.

Por exemplo, no Redhat, a ferramenta yum que executa atualizações de software do sistema é um aplicativo python. Você realmente não quer quebrar isso. Esses aplicativos podem depender da instalação de módulos python específicos, talvez não padrão, que a versão que você instalou pode não ter. Por exemplo, no Ubuntu, acredito que algumas das ferramentas integradas do SO escritas em Python usam um ORM chamado Storm que não faz parte da biblioteca padrão do Python. Sua instalação limpa do Python 2.7 tem a versão esperada específica do módulo Storm instalada? Tem alguma versão do Storm? Não? Então você acabou de quebrar um pedaço do seu sistema operacional.

A maneira correta de fazer isso é instalar sua versão preferida do python e configurar sua conta de usuário para usá-la, configurando seu .bash_profile, caminho e coisas assim. Você também pode procurar no módulo virtualenv para Python.

Simon Hibbs
fonte
1
Pesquisei no meu caminho até aqui. -1 se eu tivesse o representante nesta pilha. Por quê? Como a abordagem sugerida diz apenas "instale sua versão preferida do python". Como isso é feito sem usar o python do sistema?
Jez
Os usuários do @jez devem consultar as instruções de instalação para a combinação de aplicativos e SO de sua escolha. Em geral, os pacotes do instalador do idioma serão instalados em um local benigno, não sobrescreverão os principais componentes do sistema operacional; portanto, a substituição da versão do sistema operacional seria o caso especial.
Simon Hibbs
8

Como faço para corrigir essa bagunça?

Nada mais do que reinstalar python . Isso desfará sua alteração (o link simbólico).

Por que você deseja como padrão? Sempre que precisar, basta usar python2.7ou incluir #!/usr/bin/python2.7(o shebang) no início dos seus scripts (executáveis).

Se você insiste em ter python2.7 como padrão em todo o sistema, use uma versão posterior do Ubuntu (atualmente é o Ubuntu 11.04, codinome Natty). Ele usa essa versão como padrão.

No futuro, evite fazer intervenções manuais como o que você fez com o link simbólico. Isso é especialmente verdadeiro para arquivos gerenciados por distribuição e, principalmente, para animais complexos, como instalações em Python.

tshepang
fonte
Eu pensei que é apenas razoável alterar a instalação padrão do python depois de atualizar. Eu quero como padrão, porque eu quero trabalhar com o python mais recente ... como padrão. Quando digito pythonno bash, quero obter o novo python. Existe uma maneira melhor de fazer isso do que eu fiz?
ripper234
Apenas para observar - não acho que houvesse algo errado na maneira como instalei o python 2.7. O único movimento "não ortodoxo" foi alterar o link simbólico, que eu pensei que era a maneira correta de defini-lo como padrão. Existe uma maneira melhor?
ripper234
2
@ripper: Acho que estou chegando a esse tópico um pouco tarde. Como Tshepang diz que o pythonpacote no Ubuntu determina a versão do sistema. Agora, é possível personalizar sua instalação, de modo que o python 2.7 seja o padrão criando seu próprio pacote python, etc. é gerenciado no Debian / Ubuntu. Lembre-se de que os outros pacotes Python no sistema estão configurados para funcionar com o 2.6 como padrão, portanto, além de qualquer outra coisa, pode resultar em quebra.
Faheem Mitha
1
@Tshepang: Bom resumo!
Faheem Mitha
12
@ ripper234: Não altere nada /usr/bin, isso é reservado para sua distribuição. Em vez disso, faça /usr/local/bin/pythonum link simbólico para python2.7. Em seguida, scripts usando #!/usr/bin/env python(o idioma recomendado), além de digitar pythonna linha de comando, executarão o Python 2.7. Os scripts da distribuição que desejam o Python da distribuição podem continuar chamando #!/usr/bin/python.
Gilles 'SO- stop being evil' em
2

Disclaimer: Acabei de publicar esta mesma resposta para empilhar estouro:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Aqui está a minha opinião sobre o problema. Funciona para Python3. As principais características são:

  • Cada versão do Python é compilada a partir da fonte
  • Todas as versões são instaladas localmente
  • Não altera a instalação padrão do Python do seu sistema de forma alguma
  • Cada versão do Python é isolada com virtualenv

Os passos são os seguintes:

  1. Se você tiver várias versões python extras instaladas de alguma outra maneira, livre-se delas, por exemplo, remova $ HOME / .local / lib / python3.x , etc. (também as instaladas globalmente). Não toque na versão python3 padrão do seu sistema.

  2. Faça o download da fonte para diferentes versões do python na seguinte estrutura de diretórios:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. Em cada diretório "Python-3.xy /", faça o seguinte ( NÃO use "sudo" em nenhuma das etapas!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. Em "python_versions /", crie arquivos como este:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Agora, sempre que desejar optar pelo python3.x, faça

    source $HOME/python_versions/env_python3x.bash

    para entrar no virtualenv

  6. Enquanto estiver no virtualenv, instale seus pacotes python favoritos com

    pip install --upgrade package_name
  7. Para sair da versão virtualenv e python, digite "deactivate"

El Sampsa
fonte
0

Colocamos várias distribuições python no Mac e no Ubuntu e aqui está a minha recomendação.

  1. Deixe o python do sistema inalterado: nunca use-o.

  2. Se você precisar apenas de uma distribuição python primária, faça o download e instale o Canopy a partir do momento. Quando ele for instalado, escolha "definir como meu sistema python" e, em seguida, você poderá instalar pacotes do gerenciador de pacotes da GUI do Canopy.

    • O Canopy também é compatível com pipo comando do gerenciador de pacotes PyPi, que permite instalar pacotes (por exemplo pip install python-twitter)
  3. Se você planeja usar ambientes virtuais (ou seja, está desenvolvendo programas em python e deseja um ambiente python limpo dedicado para cada um, com um meio fácil de alternar entre eles), recomendo o Anaconda sobre o Canopy devido à sua ferramenta de gerenciamento de ambiente virtual . Isso permitirá que você
Adam Hughes
fonte
0

pyenv

https://github.com/pyenv/pyenv

O Pyenv permite gerenciar várias versões do Python sem o sudo para um único usuário, assim como o Node.js. NVM e Ruby RVM .

Instale o Pyenv:

curl https://pyenv.run | bash

Em seguida, adicione ao seu .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Encontre a versão do Python para instalar:

pyenv install --list

Instale a versão python que você deseja:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Listar as versões disponíveis do Python:

pyenv versions

Agora temos:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Selecione uma versão python diferente:

pyenv global 3.8.0
python --version
python3 --version

Ambas as saídas:

Python 3.8.0

Agora podemos instalar e usar pacotes normalmente:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Podemos confirmar que tudo está instalado localmente em nosso ambiente limpo com:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Por uso do projeto

Na seção anterior, vimos como usar o pyenv em uma configuração global.

No entanto, o que você normalmente deseja é definir uma versão específica do pacote e python por projeto. É assim que se faz.

Primeiro instale a versão desejada do Python como antes.

Em seguida, de dentro do diretório do projeto, defina a versão desejada do python com:

pyenv local 3.8.0

que cria um arquivo .python-versioncontendo a sequência de versões.

E agora vamos instalar um pacote localmente apenas para o nosso projeto: TODO: não existe uma maneira agradável: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Agora, quando alguém quiser usar seu projeto, ele fará:

pyenv local

que define a versão do Python para a correta.

Tópicos relacionados:

Testado no Ubuntu 18.04, pyenv 1.2.15.

Ciro Santilli adicionou uma nova foto
fonte