setuptools vs. distutils: por que os distutils ainda são uma coisa?

142

Python tem uma história confusa, de ferramentas que podem ser utilizadas para embalar e descrever projetos: estes incluem distutilsna biblioteca padrão, distribute, distutils2, e setuptools(e talvez mais). Parece que distributee distutils2foram descontinuados em favor de setuptools, o que deixa dois padrões concorrentes.

No meu entender, setuptoolsoferece muito mais opções (por exemplo, declarar dependências, testes etc.) do que distutils, no entanto, ainda não está incluído na biblioteca padrão do Python (ainda?).

O Guia do Usuário do Python Packaging [ 1 ] recomenda agora:

Use setuptoolspara definir projetos e criar distribuições de origem.

E explica:

Embora você possa usar pure distutilspara muitos projetos, ele não suporta a definição de dependências em outros projetos e faltam vários utilitários de conveniência para preencher automaticamente os metadados do pacote corretamente fornecidos por setuptools. Estando fora da biblioteca padrão, o setuptools também oferece um conjunto de recursos mais consistente em diferentes versões do Python e (ao contrário distutils), setuptoolsserá atualizado para produzir os próximos formatos padrão "Metadados 2.0" em todas as versões suportadas.

Mesmo para projetos que optam por usar distutils, quando o pip instala esses projetos diretamente da fonte (em vez de instalar a partir de um arquivo de roda pré-construído), ele realmente cria seu projeto usando setuptools.

No entanto, examinar vários arquivos setup.py do projeto revela que esse não parece ser um padrão real. Muitos pacotes ainda usam distutilse aqueles que suportam setuptoolsfrequentemente se misturam setuptoolscom, distutilspor exemplo, fazendo uma importação de fallback:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

Seguido de uma tentativa de encontrar uma maneira de escrever uma configuração que pode ser instalada por ambos setuptoolse distutils. Isso geralmente inclui várias formas de verificação de dependência propensa a erros, pois distutilsnão suporta dependências na função de configuração.

Por que as pessoas ainda estão fazendo um esforço extra para apoiar distutils- o fato de setuptoolsnão estar na biblioteca padrão é o único motivo? Quais são as vantagens distutilse existem desvantagens de gravar arquivos setup.py que suportam apenas setuptools.

cel
fonte
4
distutilsfoi mesclado novamentesetuptools , mas há aplicativos herdados que foram gravados para uso distutilse há custos envolvidos na migração para corrigir os padrões.
Metatoaster 16/08/14
3
"Parece que a distribuição e o distutils2 foram descontinuados em favor das ferramentas de instalação", corrija, a distribuição é apenas um wrapper para as ferramentas de instalação agora e o distutils2 está morto.
kay - SE is evil
1
setuptoolsé uma alternativa aprimorada, distutilsmas observe que " O instalador recomendado do pip executa todos os scripts setup.py setuptools, mesmo que o próprio script seja importadodistutils " ( origem )
user2314737

Respostas:

77

Dê uma olhada nesta questão SO. Ele explica todos os métodos de embalagem muito bem e pode ajudar a responder sua pergunta em certa medida: Diferenças entre distribuir, distutils, setuptools e distutils2?

Distutils ainda é a ferramenta padrão para empacotar em Python. Ele está incluído na biblioteca padrão (Python 2 e Python 3.0 a 3.3). É útil para distribuições simples do Python, mas não possui recursos. Ele apresenta o pacote Python distutils que pode ser importado no seu script setup.py.

O Setuptools foi desenvolvido para superar as limitações do Distutils e não está incluído na biblioteca padrão. Ele introduziu um utilitário de linha de comando chamado easy_install. Ele também introduziu o pacote Python setuptools que pode ser importado no seu script setup.py e o pacote Python pkg_resources que pode ser importado no seu código para localizar arquivos de dados instalados com uma distribuição. Um de seus truques é que ele corrige o pacote distutils do Python. Deve funcionar bem com pip. A versão mais recente foi lançada em julho de 2013.

Portanto, como você pode ver, as ferramentas de configuração devem ser preferidas aos distutils, e eu vejo de onde vem sua pergunta, mas não vejo distutils perdendo suporte tão cedo, pois, simplesmente, é usado em muitos casos com alguns programas legados populares . E como você provavelmente sabe que mudar esse tipo de coisa em programas herdados pode ser bastante doloroso e apresentar muitos problemas, por exemplo, incompatibilidades, o que levaria o desenvolvedor a reescrever o código-fonte. Portanto, existe isso e também o fato de o distutils fazer parte da biblioteca python padrão, enquanto o setuptools não é. Portanto, se você estiver criando um programa python, hoje em dia, use setuptools, no entanto, lembre-se de que, sem distutils, eles nunca teriam existido.

kubanczyk
fonte
3
"Distutils ainda é a ferramenta padrão para empacotar em Python." contradiz o Python Packaging User Guide.
cel
1
Eu não acredito nisso, diz explicitamente que o setuptools é o padrão. Observe também que essa frase foi citada no site que forneci, portanto, essas não são minhas palavras. No entanto, é uma opinião com a qual eu, entre muitas outras pessoas, concordo.
Eu concedi a você a recompensa, já que a comunidade parece concordar com você. Infelizmente, essa pergunta não recebeu tanta atenção quanto eu gostaria.
24514 cel Cel
O easy_install é o principal motivo pelo qual eu rejeitei o setuptools - ele tem sido uma fonte enorme de problemas para mim nos pacotes que o usam (mais fácil apenas reembalar). Outros recursos estão ok.
Stuart Gathman 03/01
14

é o fato de que setuptools não está na biblioteca padrão, a única razão

Essa é uma razão. O seguinte é direto do NumPysetup.py :

if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
        sys.argv[1] in ('--help-commands', 'egg_info', '--version',
                        'clean')):
    # Use setuptools for these commands (they don't work well or at all
    # with distutils).  For normal builds use distutils.
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup

Então, o NumPy prefere setuptoolsse pode encontrá-lo. Mas o SciPy costumava fazer isso, até que foi corrigido para preferir distutilsem algumas situações. Citando o log de confirmação:

Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.

Obviamente, uma fusão entre setuptoolse distributedeve resolver tudo isso no devido tempo, mas muitos pacotes ainda precisam oferecer suporte às instalações do Python 2.6.

Fred Foo
fonte
1
distributefoi um garfo setuptoolse agora é fundido novamente.
R4444 9/05/19
10

Existem várias razões pelas quais ainda falamos e usamos distutils, embora o setuptools seja sem dúvida o melhor conjunto de ferramentas.

Em primeiro lugar, o distutils está disponível em qualquer lugar. Se você deseja criar um módulo para compartilhar com outras pessoas e não possui requisitos complicados, é garantido que ele esteja disponível em sua máquina de trabalho. Isso é particularmente importante se você precisar oferecer suporte a versões mais antigas do python ou se estiver trabalhando em um ambiente desconhecido.

Em segundo lugar, o setuptools fornece aprimoramentos para distutils. É, portanto, modelado após o conjunto de ferramentas distutils e leva toda a sua estrutura a partir daí. A documentação para setuptools pressupõe que o leitor esteja familiarizado com distutils e apenas documenta como ele aprimora o conjunto de ferramentas base. Você pode pensar que o distutils define o dialeto e as ferramentas de configuração aprimoram esse dialeto.

Minha abordagem pessoal para novos projetos começa com a suposição de que vou usar distutils. Somente à medida que o projeto cresce para exigir um recurso de setuptools, eu faço a atualização. O setuptools é um substituto para distutils, é uma alteração de uma linha no meu setup.py.

user590028
fonte
Obrigado pela sua resposta. Eu acho que o argumento de disponibilidade não pode ser tão importante, pois a instalação do setuptools pode ser iniciada. Vejo que se o distutils fornece funcionalidade suficiente - faz sentido usá-lo. Mas misturar destutils e ferramentas de instalação, na minha opinião, não é uma maneira muito clara de atingir os objetivos. No entanto, @larsmans mostrou em sua resposta algumas dificuldades com as ferramentas de instalação que forçam o uso de distutils para algumas tarefas.
24514 cel Cel
9

Basicamente, é devido à divisão de responsabilidades.

setuptoolsnão faz parte da biblioteca padrão do Python porque é mantida por terceiros e não pela equipe principal do Python. O que significa, entre outras coisas:

  • não é coberto pelo conjunto de testes principal e não é invocado pela funcionalidade principal
  • ele próprio não define os padrões principais dos módulos complementares (localização, meios de importação, interface binária das extensões C etc.).
  • é atualizado e lançado independentemente das versões do Python

Efetivamente, a equipe principal reduziu o escopo dos distutils , reservando as partes "padrões básicos" e "compilação mínima necessária" para si , deixando todo o material além disso (compilador estendido / formato de pacote / qualquer outro suporte) para terceiros. O código que anteriormente cobria essas "partes estendidas" foi deixado obsoleto para compatibilidade com versões anteriores.

Da distribuição de módulos Python - documentação do Python 2.7.12 :

Embora o uso direto distutilsesteja sendo descontinuado, ele ainda estabeleceu as bases para a atual infraestrutura de empacotamento e distribuição, e não apenas permanece parte da biblioteca padrão, mas seu nome permanece de outras maneiras (como o nome da lista de distribuição) usado para coordenar o desenvolvimento de padrões de empacotamento do Python).

Também é provável que os pacotes para outros sistemas operacionais forneçam setuptoolse pipseparadamente - pelas razões acima mencionadas

  • e porque eles não são necessários - ou são prejudiciais para a manutenção - quando já existe outro gerenciador de pacotes no sistema.
ivan_pozdeev
fonte