pypi UserWarning: opção de distribuição desconhecida: 'install_requires'


112

Alguém encontra este aviso ao executar python setup.py installum pacote PyPI?

install_requiresdefine o que o pacote requer. Muitos pacotes PyPI têm essa opção. Como pode ser uma "opção de distribuição desconhecida"?



@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.


3
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)

pip install --upgrade pip
pip install --upgrade setuptools

Espero que isso ajude a próxima pessoa a encontrar este link!


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.


1
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.

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.


1
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.


32
setuptools está instalado. ainda tem o aviso.
Tyler Long

Você está certo, recebo este erro no Python 2.6.6, mesmo se setuptools ou distrib estiver instalado. Se eu tentar com 2.7.2, ele desaparece.
Fredrik Håård

4
Estou tendo esse problema no python 2.7.3
Calvin Cheng

2
Isso funcionou para mim: wget bootstrap.pypa.io/ez_setup.py -O - ​​| sudo python
radtek

Obrigado, @radtek, isso funcionou para mim também. Talvez você possa fazer seu comentário em uma resposta?
Esteis

4
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

Ele instalará todos os cabeçalhos ausentes. Resolveu meu problema


4

Em conclusão :

distutilsnão suporta install_requiresou entry_points, setuptoolssuporta.

mude from distutils.core import setupem setup.py para from setuptools import setupou refatore seu setup.py para usar apenas distutilsrecursos.

Vim aqui porque não tinha percebido que entry_pointsera apenas uma setuptoolscaracterística.

Se você está aqui querendo se converter setuptoolsem algo distutilscomo eu:

  1. remova install_requiresde setup.py e use apenas requirements.txt compip
  2. mude entry_pointspara scripts( doc ) e refatore quaisquer módulos contando entry_pointscom scripts completos com shebangs e um ponto de entrada.

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?
chrisinmtown

2

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 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.

Você pode silenciar o aviso da seguinte maneira:

python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>

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)


0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.