@tripleee talvez, mas essa pergunta foi feita antes dessa.
Tyler Long,
A idade da pergunta é uma preocupação secundária, mas não tenho uma opinião forte de qualquer maneira. Se você gostaria que a indicação duplicada fosse ao contrário, talvez crie uma pergunta Meta Stack Overflow para visibilidade. Para mim pessoalmente, a resposta aceita da outra questão me ajudou mais, porque é mais direta e focada. Parece que você nunca aceitou nenhuma dessas respostas, então esse é um fator que você realmente pode mudar.
tripleee
1
@tripleee se você ler este tópico com atenção, perceberá que não existe uma resposta perfeita. Portanto, não sei qual resposta aceitar. Não quero enganar as pessoas selecionando uma resposta que nem consigo me convencer.
Tyler Long,
Respostas:
89
python setup.pyusa distutils que não suporta install_requires. setuptools faz, também distribui (seu sucessor), e pip (que usa qualquer um) o faz. Mas você realmente precisa usá-los. easy_installOu seja, chame ferramentas de configuração por meio do comando ou pip install.
Outra forma é importar setuptools em seu setup.py, mas isso não é padrão e faz com que todos que desejam usar seu pacote tenham que ter setuptools instalado.
Digamos que eu queira usar pip, então como executo o setup.pyarquivo se só quero construir uma extensão no local?
Fred Foo
11
O aviso não impede que você empacote seu código, para que possa executá python setup.py sdist-lo e instalá-lo com pip install resulting_package.tar.gz. Você também pode usar pip install -epara instalar diretamente da fonte, mas sempre preferi instalar do pacote ou do repositório diretamente ..
Sebastian Blask
Isso é um pouco confuso. Você sempre pode tentar importar a configuração das ferramentas de configuração primeiro, caso contrário, vá com distutils e obtenha o aviso. Se estiver em pypy, no entanto, você pode acabar com "Muitos arquivos abertos" devido a ferramentas de configuração que não fecham os descritores corretamente (mesmo no Debian, com o ulimit -n padrão de 1024): bugs.pypy.org/issue878
fiorix
1
Veja minha resposta - pelo que eu posso dizer, este é apenas um bug direto nas ferramentas de configuração. O usuário não está fazendo nada errado, o setuptools está.
ncoghlan
Isso responde indiretamente à minha pergunta: Recebi o erro como resultado da execução pip install pendulum==1.4.4. A execução pip install setuptools --upgradeeliminou o erro.
Throw Away Account
32
Este foi o primeiro resultado da minha pesquisa no google, mas não tive resposta. Descobri que atualizar as ferramentas de configuração resolveu o problema para mim (e pip para uma boa medida)
Isso resolveu para mim também. (Python 3.4, tentando pip3 install neovim-remote.)
Michael Iles
Isso funcionou para mim. Estava tentando instalar o mako no Python 2.7.16. Tem uma opção de distribuição desconhecida semelhante. Pip estava bem, mas as ferramentas de configuração foram para 41.0.1 de 40.6.2. Em seguida, Mako instalou o A-OK.
Max Yaffe
18
ATENÇÃO ! ATENÇÃO ! Resposta imperfeita adiante. Para obter o "último memorando" sobre o estado da embalagem no universo Python, leia este ensaio bastante detalhado .
Acabei de encontrar esse problema ao tentar construir / instalar o ansible. O problema parece ser que o distutils realmente não suporta install_requires. Setuptools deve fazer um monkey-patch para distutils dinamicamente, mas não faz, provavelmente porque a última versão de setuptools é 0.6c11 de 2009, enquanto distutils é um projeto central do Python.
Portanto, mesmo depois de instalar manualmente o setuptools-0.6c11-py2.7.egg executando setup.py apenas seleciona distutils dist.py, e não aquele de site-packages / setuptools /.
Além disso, a documentação do setuptools sugere o uso do ez_setup e não do distutils.
No entanto, setuptools é fornecido por distribuir hoje em dia, e esse tipo de setup () suporta install_requires.
Votos negados, pois esta resposta contém alguma desinformação e confusão sobre o que as coisas são diferentes. ez_setup.py, por exemplo, é um instalador de bootstrap para ferramentas de configuração e não é algo que se usaria "em vez de" distutils. A maioria dos pacotes PyPI não são "simplesmente errados".
Iguananaut
1
@Iguananaut, obrigado por revisar a resposta; Eu editei.
PAStheLoD
Oh legal, obrigado. Nesse caso, irei votar novamente. :) O ensaio de Nick Coghlan que você vinculou é um que compartilhei com meus colegas de trabalho antes de tentar fazê-los envolver suas cabeças em torno dessas coisas.
Iguananaut
Grande ensaio sobre o estado das coisas em março de 2013. Uma pergunta ... O autor afirma: "Os projetos setuptoolse distributeestão em processo de fusão novamente, mas a fusão ainda não foi concluída (atualizarei este ensaio assim que que muda). " Alguém sabe como estão as coisas até 2019? Com a data de fim da vida útil do Python 2.7 se aproximando rapidamente, muitos pacotes Python estarão em processo de atualização e reembalagem.
TrinitronX de
16
Estou em um Mac com python 2.7.11. Tenho brincado com a criação de projetos extremamente simples e diretos, onde meu único requisito é que eu possa executar python setup.py installe setup.pyusar o comando setup, de preferência a partir do distutils. Não há literalmente nenhuma outra importação ou código além dos kwargs para setup()além do que anotei aqui.
Recebo o erro quando as importações para meu setup.pyarquivo são:
from distutils.core import setup
Quando eu uso isso, recebo avisos como
/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Opção de distribuição desconhecida: 'entry_points' warnings.warn ( msg)
Se eu alterar as importações (e nada mais ) para o seguinte:
from distutils.core import setup
import setuptools # noqa
Os avisos vão embora.
Observe que não estou usando setuptools, apenas importá- lo muda o comportamento para que ele não emita mais os avisos. Para mim, essa é a causa de uma diferença verdadeiramente desconcertante, onde alguns projetos que estou usando dão esses avisos e outros não.
Claramente, alguma forma de patching do macaco está acontecendo e é afetada pelo fato de essa importação ser ou não feita. Provavelmente, essa não é a situação para todos que estão pesquisando esse problema, mas para o ambiente restrito em que estou trabalhando, essa é a resposta que eu estava procurando.
Isso é consistente com o outro comentário (da comunidade), que diz que os distutils devem fazer o monkeypatch nas ferramentas de instalação e que eles tiveram o problema ao instalar o Ansible. Ansible parece ter tentado permitir instalações sem ter ferramentas de configuração no passado e voltou a fazer isso.
Muita coisa está no ar ... mas se você está procurando uma resposta simples para um projeto simples, provavelmente deve apenas importar ferramentas de configuração.
Adicionar import setuptoolstambém resolveu milagrosamente o problema para mim no ubuntu 16.04 com python 3.5.
kuropan
8
Este é um aviso do distutils e é um sinal de que você não tem ferramentas de instalação instaladas. Instalá-lo em http://pypi.python.org/pypi/setuptools removerá o aviso.
Estou tentando entender qual é o pacote recomendado. Você escreve "usar apenas recursos distutils" e "converter setuptools em distutils", mas também afirma "entry_points era apenas um recurso de setuptools", parece um pouco contraditório?
Se você tiver um incondicional import setuptoolsem seu setup.py(como deveria se estiver usando as opções específicas do setuptools), então o fato de o script não estar falhando ImportErrorindica que o setuptools está instalado corretamente.
Só faça isso se você usar a importação incondicional que irá falhar completamente se setuptools não está instalado :)
(Estou vendo o mesmo comportamento em uma verificação do repositório de setuptools pós-fusão, e é por isso que estou confiante de que é um bug de setuptools em vez de um problema de configuração do sistema. Espero que a distribuição de pré-fusão tenha o mesmo problema)
Agora vi isso em ferramentas legadas usando Python2.7, onde uma compilação (como um Dockerfile) instala uma dependência não fixada, por exemplo, pytest. O PyTest eliminou o suporte ao Python 2.7, portanto, pode ser necessário especificar a versão <a nova versão do pacote.
Ou morder a bala e converter esse aplicativo para Python 3 se isso for viável.
Respostas:
python setup.py
usa distutils que não suporta install_requires. setuptools faz, também distribui (seu sucessor), e pip (que usa qualquer um) o faz. Mas você realmente precisa usá-los.easy_install
Ou seja, chame ferramentas de configuração por meio do comando oupip install
.Outra forma é importar setuptools em seu setup.py, mas isso não é padrão e faz com que todos que desejam usar seu pacote tenham que ter setuptools instalado.
fonte
pip
, então como executo osetup.py
arquivo se só quero construir uma extensão no local?python setup.py sdist
-lo e instalá-lo compip install resulting_package.tar.gz
. Você também pode usarpip install -e
para instalar diretamente da fonte, mas sempre preferi instalar do pacote ou do repositório diretamente ..pip install pendulum==1.4.4
. A execuçãopip install setuptools --upgrade
eliminou o erro.Este foi o primeiro resultado da minha pesquisa no google, mas não tive resposta. Descobri que atualizar as ferramentas de configuração resolveu o problema para mim (e pip para uma boa medida)
Espero que isso ajude a próxima pessoa a encontrar este link!
fonte
pip3 install neovim-remote
.)ATENÇÃO ! ATENÇÃO ! Resposta imperfeita adiante. Para obter o "último memorando" sobre o estado da embalagem no universo Python, leia este ensaio bastante detalhado .
Acabei de encontrar esse problema ao tentar construir / instalar o ansible. O problema parece ser que o distutils realmente não suporta install_requires. Setuptools deve fazer um monkey-patch para distutils dinamicamente, mas não faz, provavelmente porque a última versão de setuptools é 0.6c11 de 2009, enquanto distutils é um projeto central do Python.
Portanto, mesmo depois de instalar manualmente o setuptools-0.6c11-py2.7.egg executando setup.py apenas seleciona distutils dist.py, e não aquele de site-packages / setuptools /.
Além disso, a documentação do setuptools sugere o uso do ez_setup e não do distutils.
No entanto, setuptools é fornecido por distribuir hoje em dia, e esse tipo de setup () suporta install_requires.
fonte
setuptools
edistribute
estão em processo de fusão novamente, mas a fusão ainda não foi concluída (atualizarei este ensaio assim que que muda). " Alguém sabe como estão as coisas até 2019? Com a data de fim da vida útil do Python 2.7 se aproximando rapidamente, muitos pacotes Python estarão em processo de atualização e reembalagem.Estou em um Mac com python 2.7.11. Tenho brincado com a criação de projetos extremamente simples e diretos, onde meu único requisito é que eu possa executar
python setup.py install
esetup.py
usar o comando setup, de preferência a partir do distutils. Não há literalmente nenhuma outra importação ou código além dos kwargs parasetup()
além do que anotei aqui.Recebo o erro quando as importações para meu
setup.py
arquivo são:Quando eu uso isso, recebo avisos como
Se eu alterar as importações (e nada mais ) para o seguinte:
Os avisos vão embora.
Observe que não estou usando
setuptools
, apenas importá- lo muda o comportamento para que ele não emita mais os avisos. Para mim, essa é a causa de uma diferença verdadeiramente desconcertante, onde alguns projetos que estou usando dão esses avisos e outros não.Claramente, alguma forma de patching do macaco está acontecendo e é afetada pelo fato de essa importação ser ou não feita. Provavelmente, essa não é a situação para todos que estão pesquisando esse problema, mas para o ambiente restrito em que estou trabalhando, essa é a resposta que eu estava procurando.
Isso é consistente com o outro comentário (da comunidade), que diz que os distutils devem fazer o monkeypatch nas ferramentas de instalação e que eles tiveram o problema ao instalar o Ansible. Ansible parece ter tentado permitir instalações sem ter ferramentas de configuração no passado e voltou a fazer isso.
https://github.com/ansible/ansible/blob/devel/setup.py
Muita coisa está no ar ... mas se você está procurando uma resposta simples para um projeto simples, provavelmente deve apenas importar ferramentas de configuração.
fonte
import setuptools
também resolveu milagrosamente o problema para mim no ubuntu 16.04 com python 3.5.Este é um aviso do distutils e é um sinal de que você não tem ferramentas de instalação instaladas. Instalá-lo em http://pypi.python.org/pypi/setuptools removerá o aviso.
fonte
Ele instalará todos os cabeçalhos ausentes. Resolveu meu problema
fonte
Em conclusão :
distutils
não suportainstall_requires
ouentry_points
,setuptools
suporta.mude
from distutils.core import setup
em setup.py parafrom setuptools import setup
ou refatore seu setup.py para usar apenasdistutils
recursos.Vim aqui porque não tinha percebido que
entry_points
era apenas umasetuptools
característica.Se você está aqui querendo se converter
setuptools
em algodistutils
como eu:install_requires
de setup.py e use apenas requirements.txt compip
entry_points
parascripts
( doc ) e refatore quaisquer módulos contandoentry_points
com scripts completos com shebangs e um ponto de entrada.fonte
Pelo que eu posso dizer, este é um bug no setuptools onde não está removendo as opções específicas do setuptools antes de chamar a classe base na biblioteca padrão: https://bitbucket.org/pypa/setuptools/issue/29 / Avoid-userwarnings-emitted-when-Call
Se você tiver um incondicional
import setuptools
em seusetup.py
(como deveria se estiver usando as opções específicas do setuptools), então o fato de o script não estar falhandoImportError
indica que o setuptools está instalado corretamente.Você pode silenciar o aviso da seguinte maneira:
Só faça isso se você usar a importação incondicional que irá falhar completamente se setuptools não está instalado :)
(Estou vendo o mesmo comportamento em uma verificação do repositório de setuptools pós-fusão, e é por isso que estou confiante de que é um bug de setuptools em vez de um problema de configuração do sistema. Espero que a distribuição de pré-fusão tenha o mesmo problema)
fonte
Agora vi isso em ferramentas legadas usando Python2.7, onde uma compilação (como um Dockerfile) instala uma dependência não fixada, por exemplo, pytest. O PyTest eliminou o suporte ao Python 2.7, portanto, pode ser necessário especificar a versão <a nova versão do pacote.
Ou morder a bala e converter esse aplicativo para Python 3 se isso for viável.
fonte