Descartando suporte para versões mais antigas do Python#

O descarte de suporte para versões mais antigas do Python é suportado pela especificação padrão Especificações de metadados principais 1.2 através de um atributo “Requires-Python”.

Clientes com Metadata 1.2+, como Pip 9.0+, irão aderir a esta especificação combinando o tempo de execução Python atual e comparando-o com a versão necessária nos metadados do pacote. Se eles não corresponderem, ele tentará instalar a última distribuição de pacote que oferece suporte a esse tempo de execução do Python.

Este mecanismo pode ser usado para descartar o suporte para versões mais antigas do Python, alterando o atributo “Requires-Python” nos metadados do pacote.

Este guia é especificamente para usuários de Setuptools, outras ferramentas de empacotamento como flit podem oferecer funcionalidade semelhante, mas os usuários precisarão consultar a documentação relevante.

Requisitos#

Este fluxo de trabalho exige que:

  1. O editor esteja usando a versão mais recente de Setuptools,

  2. A última versão do twine seja usada para enviar o pacote,

  3. O usuário que instala o pacote tenha pelo menos Pip 9.0 ou um cliente que tenha suporte à especificação Metadata 1.2.

Lidando com os wheels universais#

Tradicionalmente, os projetos que fornecem código Python que é semanticamente compatível com Python 2 e Python 3, produzem wheels que têm uma tag py2.py3 em seus nomes. Ao descartar o suporte para Python 2, é importante não se esquecer de alterar essa tag para apenas py3. Isso geralmente é configurado em setup.cfg na seção [bdist_wheel] definindo universal = 1 se eles usam setuptools.

Se você usar este método, remova esta opção ou seção, ou defina explicitamente universal como 0:

# setup.cfg

[bdist_wheel]
universal = 0  # Make the generated wheels have "py3" tag

Dica

Visto que ser possível sobrescrever as configurações de setup.cfg via sinalizadores CLI, certifique-se de que seus scripts não tenham --universal em seus scripts de criação de pacote.

Definindo a versão Python exigida#

1. Baixe a versão mais recente do Setuptools#

Certifique-se de, antes de gerar distribuições de fontes ou distribuições binárias, atualizar o Setuptools e instalar o twine.

Passos:

python3 -m pip install --upgrade setuptools twine
py -m pip install --upgrade setuptools twine

A versão do setuptools deve ser superior a 24.0.0.

2. Especifique os intervalos de versão para distribuições Python suportadas#

Você pode especificar intervalos de versão e regras de exclusão, como pelo menos Python 3. Ou Python 2.7, 3.4 e superior.

Exemplos:

Requires-Python: ">=3"
Requires-Python: ">2.7,!=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"

A maneira de definir esses valores está na chamada de setup dentro do seu script setup.py. Isso irá inserir os valores de metadados Requires-Python com base no argumento fornecido em python_requires.

from setuptools import setup


setup(
    # Your setup arguments
    python_requires='>=2.7',  # Your supported Python ranges
)

3. Validando o Metadata antes de publicar#

Dentro de um pacote fonte Python (o arquivo zip ou tar-gz que você baixou) está um arquivo de texto chamado PKG-INFO.

Este arquivo é gerado pelo distutils ou Setuptools quando ele gera o pacote fonte. O arquivo contém um conjunto de chaves e valores, a lista de chaves faz parte do formato de metadados padrão do PyPa.

Você pode ver o conteúdo do arquivo gerado assim:

tar xfO dist/my-package-1.0.0.tar.gz my-package-1.0.0/PKG-INFO

Valide que o seguinte está no lugar, antes de publicar o pacote:

  • Se você atualizou corretamente, o valor de Metadata-Version deve ser 1.2 ou superior.

  • O campo Requires-Python está definido e corresponde a sua especificação no setup.py.

4. Usando Twine para publicar#

Twine tem uma série de vantagens, além de ser mais rápido, agora é o método suportado para publicação de pacotes.

Certifique-se de estar usando a versão mais recente do Twine, pelo menos 1.9.

Descartando uma versão Python#

Depois de publicar um pacote com os metadados de Requires-Python, você pode fazer uma atualização adicional removendo esse tempo de execução Python do suporte.

Deve ser feito nesta ordem para que o alternativa automatizada funcione.

Por exemplo, você publicou o Requires-Python: “>=2.7” como a versão 1.0.0 do seu pacote.

Se você atualizasse a string da versão para “>=3.5” e publicasse uma nova versão 2.0.0 do seu pacote, todos os usuários executando o Pip 9.0+ a partir da versão 2.7 terão a versão 1.0.0 do pacote instalada e qualquer >=3.5 usuários receberão a versão 2.0.0.