Diferenças entre distribuir, distutils, setuptools e distutils2?

594

A situação

Estou tentando portar uma biblioteca de código aberto para o Python 3. ( SymPy , se alguém estiver se perguntando.)

Portanto, preciso executar 2to3automaticamente ao criar o Python 3. Para fazer isso, preciso usar distribute. Portanto, preciso portar o sistema atual, que (de acordo com o doctest) é distutils.


O problema

Infelizmente, eu não tenho certeza qual é a diferença entre estes Módulos- distutils, distribute, setuptools. A documentação é minuciosa da melhor maneira possível, pois todas parecem ser uma bifurcação, destinada a ser compatível na maioria das circunstâncias (mas, na verdade, não em todas) ... e assim por diante.


A questão

Alguém poderia explicar as diferenças? O que devo usar? Qual é a solução mais moderna? (Como um aparte, eu também gostaria de receber um guia sobre como migrar Distribute, mas isso está um pouco além do escopo da pergunta…)

VPeric
fonte
22
Quão confuso? Eu vim para python a partir de um plano de fundo Java / C ++. Nessas situações, a distribuição é muito direta. Com python, eu estou completamente confuso em relação a todos esses sistemas de distribuição.
Raffi Khatchadourian
75
Eu concordo, o empacotamento / instalação do Python tem muitas alternativas sem orientação clara da comunidade.
Sabuncu
6
Eu só queria vincular esta informação relacionada no pip não apoiar distribuições binárias lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
pixelbeat
O @pixelbeat pip suporta a instalação de rodas (as chamadas distribuições binárias), esse link está desatualizado.
Flimm

Respostas:

836

Em março de 2020, a maioria das outras respostas a essa pergunta está desatualizada há vários anos. Quando você encontrar conselhos sobre questões de empacotamento do Python, lembre-se de observar a data da publicação e não confie em informações desatualizadas.

O Guia do Usuário do Python Packaging vale uma leitura. Cada página tem uma data de "última atualização" exibida, para que você possa verificar a atualidade do manual, e é bastante abrangente. O fato de estar hospedado em um subdomínio python.org da Python Software Foundation apenas agrega credibilidade a ele. A página Resumos do projeto é especialmente relevante aqui.

Resumo das ferramentas:

Aqui está um resumo do cenário de empacotamento do Python:

Ferramentas suportadas:

Ferramentas obsoletas / abandonadas:

  • distributefoi um garfo de setuptools. Ele compartilhava o mesmo espaço para nome; portanto, se você tivesse o Distribute instalado, import setuptoolsrealmente importaria o pacote distribuído com o Distribute. O Distribute foi mesclado novamente no Setuptools 0.7 , para que você não precise mais usar o Distribute. De fato, a versão no Pypi é apenas uma camada de compatibilidade que instala o Setuptools.

  • distutils2foi uma tentativa de tirar o melhor de distutils, setuptoolse distributee tornar-se a ferramenta padrão incluída na biblioteca padrão do Python. A idéia era que distutils2seria distribuído para versões antigas do Python e que distutils2seria renomeado packagingpara Python 3.3, que o incluiria em sua biblioteca padrão. Esses planos não foram como pretendidos, no entanto, e atualmente, distutils2é um projeto abandonado . A versão mais recente foi em março de 2012 e sua página inicial do Pypi foi finalmente atualizada para refletir sua morte.

Outras:

Existem outras ferramentas, se você estiver interessado, leia os resumos do projeto no Guia do Usuário de Empacotamento do Python. Não vou enumerá-los todos, para não repetir essa página, e para manter a resposta correspondente a questão, que foi apenas distribute, distutils, setuptoolse distutils2.

Recomendação:

Se tudo isso é novo para você e você não sabe por onde começar, eu recomendaria aprendersetuptools , junto com pipe virtualenv, que todos funcionam muito bem juntos.

Se você está olhando para virtualenv, você pode estar interessado neste pergunta: Qual é a diferença entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc? . (Sim, eu sei, eu gemo com você.)

Flimm
fonte
2
@makeramen: Veja este tópico na lista de discussão .
Flimm
6
E não está melhor: 'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI Distribute page.
KurzedMetal
3
@KurzedMetal, de acordo com o pessoal do SetupTools, o setuptools 0.7 substituirá a distribuição e as ferramentas de configuração antigas, restaurando a ordem no universo. Então, as coisas estão realmente definidas para melhorar consideravelmente!
precisa
8
O Python Packaging User Guide terá as informações mais atualizadas sobre o estado dos pacotes python. Foi observado por Nick Coughlan no PyCon 2013 .
Imanuelcostigan
1
@Flimm A última edição foi realizada há um bom tempo. Bento já está maduro?
Martin Thoma 03/03
251

Sou mantenedor do distutils e colaborador do distutils2 / packaging. Conversei sobre o pacote Python no ConFoo 2011 e atualmente escrevo uma versão estendida dele. Ainda não foi publicado, então, aqui estão trechos que devem ajudar a definir as coisas.

  • Distutils é a ferramenta padrão usada para embalagem. Funciona bastante bem para necessidades simples, mas é limitado e não é trivial para estender.

  • O Setuptools é um projeto nascido do desejo de preencher a funcionalidade de distutils ausentes e explorar novas direções. Em algumas subcomunidades, é um padrão de fato . Ele usa remendo de macacos e magia que é desaprovada pelos desenvolvedores principais do Python.

  • Distribute é uma bifurcação de Setuptools que foi iniciada pelos desenvolvedores achando que seu ritmo de desenvolvimento era muito lento e que não era possível evoluí-lo. Seu desenvolvimento foi consideravelmente mais lento quando o distutils2 foi iniciado pelo mesmo grupo. Atualização de 2013 a agosto: a distribuição é mesclada novamente nas ferramentas de instalação e descontinuada.

  • Distutils2 é uma nova biblioteca de distutils, iniciada como um fork da base de códigos do distutils, com boas idéias extraídas das ferramentas de configuração (das quais algumas foram discutidas em PEPs) e um instalador básico inspirado pelo pip. O nome real que você usa para importar o Distutils2 está packagingna biblioteca padrão do Python 3.3+ ou distutils2em 2.4+ e 3.1–3.2. (Um backport estará disponível em breve.) O Distutils2 não fez o lançamento do Python 3.3 e foi colocado em espera.

Mais informações:

Espero terminar meu guia em breve, ele conterá mais informações sobre os pontos fortes e fracos de cada biblioteca e um guia de transição.

Éric Araujo
fonte
1
Não. O distutils2 usa algumas boas idéias de setuptools / distributing, após padronização (PEPs) ou não (por exemplo, eu oriento um aluno do GSoC que está adicionando um comando de desenvolvimento e geração automática de scripts), mas nunca será um exemplo substituição: existem algumas partes que não queremos (ovos, integração VCS, etc.). OTOH, o distutils2 tem algumas coisas que o setuptools / distribui não possui. Para facilitar a transição, acho que os desenvolvedores de distribuição talvez usem o distutils2 para dar suporte a novos padrões e ferramentas; Também acho que me lembro do desenvolvedor do setuptools dizendo que deseja dar suporte a novos padrões.
Éric Araujo
1
Onde ez_setup se encaixa nisso tudo? Também existem atualizações para o status do distutils2?
James McMahon
2
@ ÉricAraujo Lamento ouvir sobre o atraso. Eu realmente espero que esteja pronto a tempo para o 3.4! Eu amo Python, mas a embalagem sempre me fez bater minha cabeça contra a parede. (Em outras notícias, como é o seu guia vindo Se ele for concluído, você pode vinculá-lo em sua resposta acima?)
Zearin
9
@AlexisHuet Esse tipo de comentário seria melhor se contivesse o link para o comentário abaixo (que você pode obter no sharebotão).
precisa saber é o seguinte
2
talvez você deva atualizar a resposta para mencionar que distributefoi incorporada recentemente setuptools. O fato de que grande parte da informação out-lá é fora de moda aumenta a confusão
Amro
5

NOTA: Resposta descontinuada, Distribuir agora obsoleto. Essa resposta não é mais válida desde que a Autoridade de Empacotamento do Python foi formada e trabalhou bastante para limpá-la.


Sim, você entendeu. : -o Acho que, neste momento, o pacote preferido é o Distribute , que é um garfo de ferramentas de instalação, que são uma extensão dos distutils (o sistema de embalagem original). O Setuptools não estava sendo mantido, por isso foi bifurcado e renomeado, no entanto, quando instalado, ele usa o nome do pacote setuptools! Eu acho que a maioria dos desenvolvedores de Python agora usa o Distribute, e posso dizer com certeza que sim.

Keith
fonte
Para que conste, aceitei esta resposta porque ela me dizia a situação agora (e o garfo é uma extensão da relação que a imagem na outra resposta simplesmente não menciona). E em algum lugar ao longo da estrada, também aprendi que a documentação em si geralmente não tem certeza do que está tentando dizer.
VPeric
2
@VPeric, De fato, a documentação reflete o fato de que esse aspecto do python está em um estado de fluxo / confusão.
Juanchopanza
2

Sei que respondi à sua pergunta secundária sem abordar suposições inquestionáveis ​​no seu problema original:

Estou tentando portar uma biblioteca de código aberto (SymPy, se alguém estiver se perguntando) para o Python 3. Para fazer isso, preciso executar o 2to3 automaticamente ao criar para o Python 3.

Você pode , não precisa . Outras estratégias são descritas em http://docs.python.org/dev/howto/pyporting

Para fazer isso, eu preciso usar distribuir,

Você pode :) O distutils suporta a conversão 2to3 em tempo de construção para código (não docstrings), de uma maneira diferente que distribui: http://docs.python.org/dev/howto/pyporting#during-installation

Éric Araujo
fonte
Obrigado, embora já tenhamos decidido resolver o problema escrevendo nosso script para lidar com a conversão. E sim, eu sabia que havia outras opções além do uso do 2to3, mas o SymPy é uma base de código complexa (cerca de 200k + linhas na última vez que verifiquei) e o uso do 2to3 era a única estratégia realista. Obrigado novamente, em qualquer caso!
VPeric 31/07
2

Atualizando essa pergunta no final de 2014, onde felizmente o caos das embalagens Python foi bastante limpo pelo gerenciador de pacotes " conda " da Continuum .

Em particular, o conda permite rapidamente a criação de " ambientes " do conda . Você pode configurar seus ambientes com diferentes versões do Python. Por exemplo:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

criará dois ambientes Python ("py34" ou "py26") com diferentes versões do Python.

Depois, você pode invocar o ambiente com a versão específica do Python com:

source activate <env name>

Esse recurso parece especialmente útil no seu caso em que você está tendo que lidar com versões diferentes do Python.

Além disso, o conda possui os seguintes recursos:

  • Agnóstico em Python
  • Plataforma cruzada
  • Não são necessários privilégios de administrador
  • Gerenciamento inteligente de dependências (por meio de um solucionador SAT)
  • Lida bem com as bibliotecas C, Fortran e no nível do sistema que você pode precisar vincular

Esse último ponto é especialmente importante se você estiver na arena da computação científica.

Julien Chastang
fonte