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 2to3
automaticamente 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…)
Respostas:
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:
distutils
ainda é a ferramenta padrão para empacotar em Python. Ele está incluído na biblioteca padrão (Python 2 e Python 3). É útil para distribuições simples do Python, mas não possui recursos. Ele apresenta odistutils
pacote Python que pode ser importado em seusetup.py
script.distutils
seção do Guia do Usuário do Pacote Pythonsetuptools
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 chamadoeasy_install
. Ele também introduziu osetuptools
pacote Python que pode ser importado em seusetup.py
script e opkg_resources
pacote Python que pode ser importado em seu código para localizar arquivos de dados instalados com uma distribuição. Um de seus truques é que ele corrige odistutils
pacote Python. Deve funcionar bem compip
. Vê lançamentos regulares.setuptools
seção do Guia do Usuário do Pacote Pythonscikit-build
é um gerador de sistema de compilação aprimorado que usa internamente o CMake para criar extensões Python compiladas. Como o scikit-build não é baseado em distutils, ele realmente não tem nenhuma de suas limitações. Quando o ninja-build está presente, o scikit-build pode compilar grandes projetos três vezes mais rápido que as alternativas. Deve funcionar bem compip
.scikit-build
seção do Guia do Usuário do Pacote Pythondistlib
é uma biblioteca que fornece funcionalidade usada por ferramentas de nível superior comopip
.distlib
seção do Guia do Usuário do Pacote Pythonpackaging
também é uma biblioteca que fornece funcionalidade usada por ferramentas de nível superior comopip
esetuptools
packaging
seção do Guia do Usuário do Pacote PythonFerramentas obsoletas / abandonadas:
distribute
foi um garfo desetuptools
. Ele compartilhava o mesmo espaço para nome; portanto, se você tivesse o Distribute instalado,import setuptools
realmente 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.distutils2
foi uma tentativa de tirar o melhor dedistutils
,setuptools
edistribute
e tornar-se a ferramenta padrão incluída na biblioteca padrão do Python. A idéia era quedistutils2
seria distribuído para versões antigas do Python e quedistutils2
seria renomeadopackaging
para 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
,setuptools
edistutils2
.Recomendação:
Se tudo isso é novo para você e você não sabe por onde começar, eu recomendaria aprender
setuptools
, junto compip
evirtualenv
, que todos funcionam muito bem juntos.Se você está olhando para
virtualenv
, você pode estar interessado neste pergunta: Qual é a diferença entrevenv
,pyvenv
,pyenv
,virtualenv
,virtualenvwrapper
, etc? . (Sim, eu sei, eu gemo com você.)fonte
'Distribute' is a now deprecated fork of the 'Setuptools' project.
@ PyPI Distribute page.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áDistutils2 não fez o lançamento do Python 3.3 e foi colocado em espera.packaging
na biblioteca padrão do Python 3.3+ oudistutils2
em 2.4+ e 3.1–3.2. (Um backport estará disponível em breve.) OMais 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.
fonte
share
botão).distribute
foi incorporada recentementesetuptools
. O fato de que grande parte da informação out-lá é fora de moda aumenta a confusãoNOTA: 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.
fonte
Sei que respondi à sua pergunta secundária sem abordar suposições inquestionáveis no seu problema original:
Você pode , não precisa . Outras estratégias são descritas em http://docs.python.org/dev/howto/pyporting
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
fonte
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:
Esse último ponto é especialmente importante se você estiver na arena da computação científica.
fonte