Articles

Como usar o pyenv para executar várias versões do Python em um Mac

gerenciando um ambiente de Desenvolvimento Local em Python continua a ser um desafio, mesmo para desenvolvedores experientes. Embora existam estratégias bem documentadas para a gestão de pacotes, há outro passo necessário para garantir que você está executando a versão do Python que você precisa quando você precisa dele.

por que a versão do Python importa?

é um conceito estranho no início, mas as linguagens de programação mudam como qualquer outro software. Eles têm bugs, correções e atualizações como qualquer uma das suas APIs favoritas e qualquer outro software. Similarmente novamente, diferentes lançamentos são identificados por um número de três dígitos conhecido como uma versão semântica.

😭😭😭 pic.twitter.com/yt1Z2439W8

— Denny Perez (@dennyperez18) 28 de Maio de 2019

Durante muitos anos, Python 2 foi utilizada comumente principais versão da linguagem de programação. Em janeiro de 2020, O Python 2 chegou ao fim da vida, e apenas o Python 3 será suportado pelos principais mantenedores da linguagem a partir de então. O Python 3 está se desenvolvendo de forma constante e lançando novas atualizações regularmente. Isso faz com que seja importante para mim obter essas actualizações regularmente.

recentemente, eu tentei executar um projeto em macOS que dependia do Python 3.5.9, uma versão que eu não tinha instalado no meu sistema. Pode parecer lógico pensar que o Python package manager pip pode instalá-lo*, mas que não era o caso:

$ pip install python3.5.9
Collecting python3.5.9
ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9

Alternativamente, eu poderia ter baixado a versão oficial do Python site, mas como eu iria executá-lo em meu Mac lado a minha versão existente do Python? Especificando a versão do Python que pretendo usar cada vez que executar o interpretador (python3.7 ou python3. 5, por exemplo) parece propenso a erros na melhor das hipóteses. Tem de haver uma maneira melhor.

(uma nota sobre o acima: eu sei que isso não faz sentido para programador de Python temperado, mas fez sentido para mim na época. Gostaria de falar sobre o porquê de ainda achar que deveria.)

Instalando e configurando pyenv

felizmente, pyenv existe para trabalhar em torno desta série de complexidades. Para começar, precisava de instalar o pyenv. Eu poderia cloná-lo e compilá-lo eu mesmo a partir do código, mas eu prefiro gerenciar pacotes como este através do Gerenciador de pacotes Homebrew:

$ brew install pyenv

a fim de usar a versão do Python através do pyenv, é essencial compreender a variável PATH da shell. A localização determina onde a linha de comandos procura ficheiros pelo nome do comando. Você deve garantir que a shell irá encontrar a versão do Python executada pelo pyenv, não a instalada por padrão (que é muitas vezes chamada de versão do sistema). Se você não mudar o caminho, aqui está o resultado:

$ which python
/usr/bin/python

essa é a versão do sistema de Python.

para configurar o pyenv correctamente, pode executar o seguinte no Bash ou no zsh:

$ PATH=$(pyenv root)/shims:$PATH

Agora, se você verificar a versão do Python, você verá que ele é um gerida por pyenv:

$ which python
/Users/my_username/.pyenv/shims/python

Essa declaração de exportação (PATH=) só vai mudar para esta instância do shell, para fazer uma mudança permanente, você precisa adicioná-lo ao seu dotfiles. Como o zsh é oficialmente a concha padrão da macOS, vou concentrar-me nisso. Adicione essa mesma sintaxe ao ~/.zshrc file:

$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

Agora cada vez que executarmos um comando em zsh, ele irá usar a versão pyenv do Python. Note que eu usei citações simples com echo para que ele não avalie e expanda os comandos.

A .o ficheiro zshrc só gere instâncias zsh, por isso certifique-se de verificar o que é a sua linha de comandos e editar os dotfiles associados. Se precisar de verificar novamente Qual é a sua shell por omissão, poderá executar a echo $SHELL. Se for zsh, use o comando acima. Se você usar Bash, mude ~/.zshrc para ~/.bashrc. Você pode mergulhar profundamente na configuração do caminho no README de pyenv se você gostaria de aprender mais.

Usando pyenv para gerenciar versões de Python

Agora que pyenv está no controle, podemos ver que só tem o sistema de Python disponível:

$ pyenv versions
system

Como mencionado acima, você absolutamente não quer usar essa versão (leia mais sobre o porquê). Agora que o pyenv está configurado corretamente, eu quero que ele tenha algumas versões diferentes do Python que eu uso regularmente.

Existe uma forma de ver todas as versões em Python disponíveis em todos os repositórios diferentes aos quais o pyenv tem acesso, executando o pyenv install –list. É uma lista longa e esmagadora que pode ser útil para rever no futuro. Por agora, eu fico com o mais recente de cada dot-release (3.5.x ou 3.6.x onde o x é o mais recente) encontrado na página de download em Python. Com isso em mente, vou instalar 3.5.9 e 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

isto vai demorar um pouco, então pegue um chá (ou leia um dos links acima). É interessante notar que a saída percorre o download e a construção dessa versão do Python. Por exemplo, a saída mostra que o arquivo vem diretamente de Python.org.

Uma vez que tudo esteja instalado, você poderá configurar os seus valores por omissão. Gosto de viver na vanguarda, por isso configuro a minha versão global predefinida em Python como a mais recente:

E essa versão é imediatamente definida na minha linha de comandos. Para confirmar:

$ python -V
Python 3.8.0

O projeto que pretende executar obras apenas com Python 3.5, então eu vou definir a versão localmente e confirmar que está em uso:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

Porque eu usei a opção de local com pyenv, é adicionado um arquivo para o meu diretório atual para acompanhar essa informação.

$ cat .python-version
3.5.9

Agora, posso finalmente configurar um ambiente virtual para o projecto que quero e ter a certeza que estou a correr a versão correcta do Python.

$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python

para saber mais, confira este tutorial sobre a gestão de ambientes virtuais num Mac.

encerrar

por omissão, executar várias versões Python pode ser um desafio. Acho que começar com pyenv garante que eu tenho as versões do Python que eu preciso configurar para executar quando eu preciso deles.