Created: 2021-05-27 14:25 | Updated: 2024-10-11 19:12 |
Este artigo contém as informações necessárias para instalar a versão 3.x do Python no Debian Linux Buster (10.x) à partir do código fonte.
Esta instalação não irá remover a versão do Python instalada no sistema, mas permitirá o uso de uma versão mais atual da linguagem e do interpretador. Optei por não substituir a versão original do sistema porque muitas aplicações e ferramentas do sistema no Debian dependem do Python e a versão da distribuição possui muitos módulos específicos.
Instale os seguintes pacotes necessários para a compilação do Python3:
sudo apt install build-essential dpkg-dev gdb lcov libbz2-dev \
libc6-dev libffi-dev libgdbm-compat-dev libgdbm-dev liblzma-dev \
libmpd-dev libncurses5-dev libncursesw5-dev libreadline6-dev \
libreadline-dev libsqlite3-dev libssl-dev lzma lzma-dev \
pkg-config tk-dev uuid-dev zlib1g-dev rust-all
O pacote rust-all é necessário para alguns módulos que podemos instalar futuramente. Um exemplo é módulo rpds_py, que é um dos requisitos para o Jupyter Notebook, entre outros.
Dica: caso seja necessário instalar a ultima versão do Rust, pode-se tentar o seguinte comando:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Este comando instala o Rust toolchain apenas para o usuário local e, portanto, você deve adicionar o diretório de instalação do PATH de seu usuário (normalmente ~/.cargo/bin).
Para fins didáticos, e facilidade de cópia dos comandos, vou usar a seguinte variável de ambiente que define a versão do Python a ser compilada e instalada:
PYVER=3.12.2
Caso você esteja em ambiente Linux, que é o sistema usado neste artigo, o uso desta variável facilita o processo de copiar e colar os comandos a seguir. é uma opção pessoal. Caso você ache compĺicado ou não queira usá-la, basta substituir o texto ${PYVER} nos comandos a seguir pelo número de versão do Python em questão (exemplo: para a versão 3.12.2 do Python, troque todas as ocorrências de "${PYVER}" por "3.12.2" (sem as aspas).
Descompacte, configure, compile e instale o Python (estou assumindo que o arquivo do código fonte do Python já tenha sido baixado do site http://www.python.org):
PYVER=3.12.2
tar xJvf Python-${PYVER}.tar.xz
cd Python-${PYVER}
./configure --prefix=/opt/python-${PYVER} --enable-optimizations --disable-gil
make -j 8
sudo make install
O comando configure permite o uso de várias flags, sendo as mais comuns as seguintes:
-disable-gil: para Python-3.13: habilita o suporte a execução sem GIL; - --enable-pydebug: esta flag é sugerida na do documentação do Python, porém, seu uso é destinado aos desenvolvedores da linguagem, e não dos programadores que usam o Python; - --enable-shared: esta flag pode não ser uma boa ideia em todos os casos, então, se ficar na dúvida, não a use. De forma simples, o uso de bibliotecas compartilhadas faz com que o arquivo executável gerado seja menor, porque parte do código do Python será gravado em arquivo separado. Isso faz com que o arquivo executável seja carregado mais rapidamente, já que ele vai ler o arquivo de biblioteca (algo como libpython3.XX.so.1.0) quando precisar. Se esta flag não for inserida no comando, a compilação será estática, ou seja, a biblioteca (por exemplo, libpython3.XX.so.1.0) que poderia ficar em arquivo separado, será inclusa no arquivo executável do comando python. Isso faz com que o carregamento do arquivo seja mais lento, porém, não exige nenhuma configuração extra do sistema. Por exemplo, no Linux, eu sempre opto por instalar o Python em pasta exclusiva (/opt/python-X.Y.Z) para evitar que ele interfira nos aplicativos do sistema operacional que usam o Python padrão do sistema (sim, no Linux há muitos aplicativos em Python, inclusive ferramentas de sistema). Neste caso, se eu compilar com a opção --enable-shared, será necessário adicionar o caminho para a pasta onde as bibliotecas compartilhadas foram instaladas nas configurações do sistema operacional (veja a configuração do ld.so.conf logo a seguir); - --enable-optimizations: é uma boa opção para melhorar a performance geral do Python, com o custo adicional de demorar mais para que a compilação seja finalizada, dependendo dos recursos do computador, pode demorar até 3 vezes mais para compilar. De qualquer forma, eu usaria esta opção.
No comando make, a oção -j 8 indica o número de processos que o make pode utilizar edeve ser ajustado para os recursos do seu computador. Normalmente, para maior rapidez, usamos o mesmo número de cores ou CPUs do computador. Nas versões recentes do make, se omitirmos o número de jobs na opçção -j, o make usará o máximo que ele conseguir. Note que, teoricamente, quanto mais processos, mais rápida será a compilação, porém, maior processamento e I/O de disco será utilizado do computador, então, a usabilidade do computador pode ficar comprometida durante o processo de compilação.
O último comando (make install) irá instalar a nova versão do Python em /opt/${PYVER}.
Atenção: Os dois passos a seguir só devem ser executados se você optou por habilitar a flag --enable-shared descrita anteriormente.
Atualize o cache de bibliotecas do sistema operacional. Para fazer isto, crie o arquivo /etc/ld.so.conf.d/python.conf e adicione o seguinte conteúdo:
/opt/python-VERSÃO/lib
Substitua VERSÃO pela versão do Python em questão.
Grave o arquivo e atualize o cache das bibliotecas:
sudo ldconfig
Atualize as ferramentas pip e setuptools:
cd /opt/python-${PYVER}/bin
sudo ./pip3 install --upgrade pip
sudo ./pip install --upgrade setuptools
Instale o Cython (biblioteca para uso de código em C/C++ junto com Python):
sudo ./pip3 install cython
Adicione a nova versão do Python no PATH de seu usuário: edite o arquivo ~/.bashrc e altera a variável PATH. Veja o exemplo:
export PATH=/home/mario/bin:/opt/python-3.9.2/bin:/opt/Qt5.12.1/Tools/QtCreator/bin/:$PATH
Para que o Qt, é preciso instalar as biblioteca no sistema operacional.
Instale as dependências:
sudo apt install libpoppler-qt5-1 libqt5concurrent5 \
libqt5core5a libqt5dbus5 libqt5designer5 libqt5gui5 \
libqt5help5 libqt5network5 libqt5opengl5 \
libqt5opengl5-dev libqt5printsupport5 \
libqt5qml5 libqt5quick5 libqt5script5 libqt5sql5 \
libqt5sql5-sqlite libqt5svg5 libqt5test5 libqt5webkit5 \
libqt5widgets5 libqt5xml5 libqt5xmlpatterns5 \
libqt5xmlpatterns5-dev python-pyqt5 \
python-pyqt5.qtsvg python-pyqt5.qtwebkit \
qt5-qmake qtbase5-dev libqt5xmlpatterns5-dev libxcb-cursor0
Instale o módulo de suporte ao Qt5 no Python:
cd /opt/python-3.9.2/bin
sudo ./pip3 install PyQt5
A biblioteca PySide2 está disponível no repositório PyPI, o que torna a instalação quase que trivial (desde que as dependências descritas anteriormente esteja instaladas)::
cd /opt/python-3.9.2/bin
sudo ./pip3 install PySide6
Eu costumo utilizar algumas ferramentas desenvolvidas em Python, tanto ferramentas disponíveis na Internet como de minha própria autoria e que precisam de alguns módulos específicos. Então, até para manter uma lista destes módulos e aplicações, segue a lista que eu costumo instalar após a instalação do Python. No entanto, alguns destes módulos possuem dependências que precisam ser instaladas antes:
Módulo | Biblioteca | Comando para instalação |
---|---|---|
lxml | libxml2-dev, libxslt1-dev | sudo aptitude install libxml2-dev libxslt1-dev |
cryptography | libffi-dev | sudo aptitude install libffi-dev |
GeoIP | libgeoip-dev, libgeoip-bin | sudo aptitude install libgeoip-dev libgeoip-bin |
Quando uso um editor para programação em Python, mais especificamente para o VSCode ou Codium, eu costumo instalar também os seguintes pacotes:
pip install black
pip install pylint
pip install pyright
Para facilitar a vida, podemos criar um arquivo texto contendo todos os módulos e aplicações que desejamos instalar, com um item por linha, conforme a lista a seguir:
alabaster
beautifulsoup4
chardet
cloud-sptheme
cryptography
dnspython3
flake8
Flask
httplib2
imapclient
lxml
matplotlib
netaddr
nose
numpy
oauth2client
oauthlib
paho-mqtt
pandas
paramiko
pdfrw
pep8
psutil
psycopg2
psycopg2-binary
pydbus
pydialog
pygame
PyInstaller
pymongo
pyPdf
pypyodbc
pyserial
python-dateutil
pythondialog
python-magic
pyusb
requests
requests-oauthlib
rsa
scapy
scikit-learn
scipy
shodan
Slowloris
Sphinx
sphinx-bootstrap-theme
sphinxcontrib-disqus
sphinx-intl
sphinxjp.themecore
sphinxjp.themes.htmlslide
sphinxjp.themes.tinkerpress
sphinx-rtd-theme
sqlalchemy
sslscan
Tinkerer
tornado
virustotal2
websockets
Werkzeug
wheel
xlrd
Criado o arquivo, basta solicitar so pip que instale todos os módulos. Por exemplo, supondo que o arquivo com os nomes dos módulos e aplicações seja o arquivo /tmp/requirements.txt, o comando a seguir instalará todos os módulos contidos no arquivo:
cd /opt/python-3.9.2/bin
sudo ./pip3 install -r /tmp/requirements.txt
Um detalhe importante: a instalação a partir de arquivo é muito prática, porém deve-se ficar atento para possíveis erros. Nestes casos, observe as mensagens na tela e corrija os problemas.
O pacote PyGame é necessário para uso com Kivy. Normalmente eu instalo diretamente do código fonte, mas nesta versão de Python precisei apenas instalar algumas dependências e depois instalar o PyGame e o Kivy diretamente do PIP.
Eis as dependências:
sudo apt install fonts-freefont-ttf \
libfreetype6 libjpeg62-turbo libpng16-16 \
libportmidi0 libsdl-image1.2 libsdl-mixer1.2 \
libsdl-ttf2.0-0 libsdl1.2debian libflac-dev \
libmad0-dev libmikmod-config libmikmod-dev \
libsdl-image1.2-dev libsdl-mixer1.2-dev \
libsdl-ttf2.0-dev libwebp-dev
A instalação via PIP ocorreu assim:
sudo ./pip3 install pygame
Da mesma forma para o Kivy:
sudo ./pip3 install kivy[base] kivy_examples --pre --extra-index-url https://kivy.org/downloads/simple/
Para testar, execute o seguinte código::
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='Hello World')
TestApp().run()
Instalar o Python a partir do código-fonte não é uma tarefa difícil, mas trabalhosa. A compilação, caso sejam habilitados os testes, pode demorar bastante dependendo dos recursos computacionais disponíveis. No entanto, esta á uma opção para podermos testar e usar as últimas versões do Python.