====== Gerencie versões e ambientes virtuais do python com pyenv ====== Uma ferramenta interessante para lidar com as inúmeras versões do __python__ e deixar seus projetos bem isolados da versão do __python__ de seu sistema é o **pyenv**. ===== O que é o pyenv? ===== Como o próprio [[https://github.com/pyenv/pyenv?tab=readme-ov-file#simple-python-version-management-pyenv|projeto]] diz, > //Simple Python Version Management: pyenv// Simples gerenciador de versão do __python__ (tradução livre minha). Ele pode se instalar em sua //home// e temos a possibilidade de escolher quais versões do __python__ instalar, montar um ambiente virtual com uma versão específica do __python__ escolher globalmente a versão desejada ou localmente qual ambiente virtual usar ou a versão, isolando assim o __python__ nativo de sua distro. ===== Instalação ===== Vamos inicialmente instalar as dependências para que o __python__ possa ser compilado em seu sistema, no caso do Debian podemos usar a seguinte linha, precisará ter privilégios de superusuário para tal apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \ libsqlite3-dev curl git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \ libffi-dev liblzma-dev no Arch linux, também como superusuário pacman -S --needed base-devel openssl zlib xz tk No FreeBSD, também como superusuário: pkg install shells/bash ftp/curl devel/git databases/sqlite3 Já no GuixSD teremos que emular um //shell// com as dependências guix shell -C --emulate-fhs --network --preserve=^SSL_CERT --preserve=^HOME \ --share=$SSL_CERT_DIR --share=/etc/ssl/certs/ --share=$HOME/tmp=$HOME coreutils \ bash wget curl vim git sed grep gawk tar gzip gcc-toolchain pkg-config python\ findutils make zlib openssl bzip2 ncurses libffi readline sqlite xz -- bash o trecho ''-''''-share=$HOME/tmp=$HOME'' especifica que no //shell// emulado a pasta //home// estará dentro de um diertório //tmp// na pasta pessoal, isso é opcional. Agora é só usar o instalador automático curl https://pyenv.run | bash Ao término desse processo o próprio instalador dará um trecho a ser adicionado em seu arquivo ''.bashrc'' para que o **pyenv** se torne acessível, pode copiar e colar o seguinte trecho export PYENV_ROOT="$HOME/.pyenv" [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init - sh)" eval "$(pyenv virtualenv-init -)" Reinicie seu terminal ou simplesmente faça ''source .bashrc'' para ter o comando **pyenv** disponível. ===== Instalando versões do python ===== Para verificar as versões disponíveis do **python**, faça pyenv install -l use o **grep** caso esteja buscando por uma versão em específico e quer verificar se a mesma está disponível pyenv install -l | grep 3.12 Caso queira por exemplo o **python** 3.12 na última revisão basta omitir o terceiro número da versão e executar o comando sem a flag ''-l'' pyenv install 3.12 ===== Definindo a versão do python que será usada ===== Agora que temos o **python** na última revisão da versão 3.12 (ou qualquer uma que você tenha instalado - lembre-se que poderá instalar qualquer versão desejada e quantas quiser), podemos usá-la de forma global ao invés do **python** nativo de seu sistema: pyenv global 3.12 Ao definir o uso de uma versão de forma global, essa versão estará automaticamente definida em ''/home/usuario/.pyenv/shims/python'', o qual pode ser verificado com ''whereis python'' Assim, toda vez que usar o comando **python** essa versão que escolhemos é que irá executar, veja que ela esta armazenada na sua //home//, basta executar o comando pyenv which python e verá que a saída é algo do tipo ''/home/username/.pyenv/versions/3.13.2/bin/python''. Porém podemos optar pelo uso de uma determinada versão num diretório de um projeto, caso não queira organizar esse projeto num ambiente virtual próprio apenas entre na pasta desejada e execute pyenv local 3.12 e a versão 3.12 será usada sempre que você estiver nesse diretório em específico e em todos os subdiretórios dele. ===== Definindo ambientes virtuais ===== Apesar do uso de versões em subpastas, muitas vezes é melhor organizar o projeto em ambientes virtuais construídos para abrigar as dependências daquele projeto. Usando o **pyenv** fica bem simples fazer essa organização, basta criarmos uma "versão" do **pyton** que chamaremos com o nome do ambiente desejado. Por exemplo, quero que meu projeto de nome "projetoZ" seja desenvolvido usando o **python** 3.12.2, então após instalar essa versão podemos usar pyenv virtualenv 3.12.2 projetoZ Agora temos uma nova versão chamada "projetoZ", verifique as versões disponíveis com ''pyenv versions'', dessa forma na pasta de seu projeto (após ''cd projetoZ'') basta usar pyenv local projetoZ e por conta da linha ''eval "$(pyenv virtualenv-init -)"'' adicionada no ''.bashrc'' esse ambiente é ativado automaticamente toda vez que entrar nesse diretório. Você pode verificar onde estão os arquivos das bibliotecas do **python** sempre com o comando ''pyenv which python'' dentro da pasta de seu projeto. ===== Conclusão ===== Temos agora disponível uma ferramenta para buscar por versões do **python**, instalá-las e isolar as bibliotecas necessárias para cada projeto em específico e seus respectivos ambientes virtuais. Isso traz uma certa vantagem sobre a forma canônica de criar ambientes virtuais no **python**. Pois ainda é possível selecionar uma versão do **python** e criar o ambiente virtual na maneira //pythônica// usando python -m venv .venv onde ''.venv'' é o nome da pasta que contém o ambiente criado, ative o mesmo usando source ./.venv/bin/active Para alguns a forma //pythônica// é melhor por manter no diretório do projeto as bibliotecas usadas, o **pyenv** apenas amplia as possibilidades para que você possa desenvolver seus projetos em Python da melhor forma possível.