pypi UserWarning:未知分发选项:“ install_requires”


112

执行python setup.py installPyPI包时,有人会遇到此警告吗?

install_requires定义软件包的要求。许多PyPI软件包都有此选项。怎么可能是“未知分发选项”?



也许是@tripleee,但是这个问题早于那个问题被问到了。
泰勒·朗

询问年龄是次要问题,但我都没有强烈的意见。如果您希望重复的提名反其道而行之,则可以创建一个Meta Stack Overflow问题以提高知名度。就我个人而言,另一个问题的公认答案对我有所帮助,因为它更直接,更专注。您似乎从未接受过这些答案中的任何一个,因此这是您实际上可以更改的一个因素。
人间

1
@tripleee如果您仔细阅读此主题,您将意识到根本没有完美的答案。所以我不知道接受哪个答案。我不想通过选择甚至无法说服自己的答案来误导人们。
泰勒·朗

Answers:


89

python setup.py使用不支持install_requires的distutils。setuptools这样做,还分发(它的后继),而pip(使用这两者之一)这样做。但是实际上您必须使用它们。即通过easy_install命令或调用setuptools pip install

另一种方法是从setup.py中的setuptools导入安装程序,但这不是标准方法,这使得每个想要使用您的软件包的人都必须安装setuptools。


3
假设我要使用pip,那么setup.py如果我只想就地构建扩展程序,该如何运行文件?
弗雷德·富

11
警告不会阻止您打包代码,因此可以使用来运行python setup.py sdist和安装代码pip install resulting_package.tar.gz。您还可以使用pip install -e直接从源代码安装,但我总是选择软件包或仓库直接安装..
塞巴斯蒂安·布拉斯克

这有点混乱。您总是可以先尝试从setuptools导入安装程序,否则,请与distutils一起使用并获得警告。但是,如果它在pypy中,则由于setuptools无法正确关闭描述符(即使在Debian上,默认ulimit -n为1024)也可能导致“打开的文件太多”:bugs.pypy.org/issue878
fiorix

1
查看我的答案-据我所知,这只是setuptools中的一个直接错误。用户没有做任何错误,setuptools是。
ncoghlan

这间接地回答了我的问题:运行导致了错误pip install pendulum==1.4.4。运行pip install setuptools --upgrade清除错误。
扔掉帐户,

32

这是我的Google搜索的第一个结果,但没有答案。我发现升级setuptools可以为我解决问题(并且可以通过点子获得很好的效果)

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

希望这有助于下一个人找到此链接!


这也为我解决了。(Python 3.4,试图这样做pip3 install neovim-remote。)
Michael Iles

这对我有用。试图在python 2.7.16上安装mako。得到了类似的未知分发选项。Pip还可以,但是setuptools从40.6.2升至41.0.1。然后,Mako安装了A-OK。
Max Yaffe

18

注意注意!前面的答案不完善。要获取有关Python宇宙中包装状态的“最新备忘”,请阅读此相当详细的文章

我刚尝试构建/安装ansible时遇到了这个问题。问题似乎是distutils确实不支持 install_requires。Setuptools 应该动态地对distutils进行猴子补丁,但事实并非如此,这可能是因为setuptools的最新版本是2009年的0.6c11,而distutils是Python的核心项目。

因此,即使在手动安装setuptools-0.6c11-py2.7.egg之后运行setup.py,也只能选择distutils dist.py,而不会从site-packages / setuptools /中获取。

setuptools文档还提示您使用ez_setup而不是distutils。

但是,setuptools本身现在由分发服务器提供,setup()的风格支持install_requires。


1
不满意,因为这个答案包含关于什么是不同的东西的一些虚假信息和混乱。例如,ez_setup.py是用于setuptools的引导程序安装程序,不是一个可以代替“ distutils”使用的东西。大多数PyPI软件包都不是“完全错误的”。
Iguananaut

1
@Iguananaut,感谢您审查答案;我已经编辑了
PAStheLoD 2013年

哦,太好了,谢谢。在这种情况下,我将重新提出评论:)您链接到的尼克·科格兰的文章是我与同事分享的,然后试图让他们的头将这些东西包裹起来。
Iguananaut 2013年

关于2013年3月事情状态的精彩文章。一个问题...作者指出:“ setuptoolsdistribute项目正在合并在一起,但是合并尚未完成(我将尽快更新此文章改变)。” 有人知道截至2019年的情况吗?随着Python 2.7生命周期终止日期的临近,许多python软件包将处于更新和重新打包的过程中。
TrinitronX

16

我在使用python 2.7.11的Mac上。我一直在创建极其简单明了的项目,我唯一的要求就是我可以运行python setup.py install,并且setup.py使用了distutils的setup命令。除了setup()我在这里提到的内容以外,除了kwargs之外,实际上没有其他导入或代码。

当我的setup.py文件导入为时,出现错误:

from distutils.core import setup

使用此功能时,我会收到诸如

/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267:用户警告:未知的分发选项:'entry_points'warnings.warn(味精)

如果我将导入(以及其他内容)更改为以下内容:

from distutils.core import setup
import setuptools  # noqa

警告消失。

请注意,我没有使用setuptools,只是导入它会更改行为,以使其不再发出警告。对我来说,这是造成真正莫名其妙的差异的原因,其中我正在使用的某些项目发出这些警告,而另一些则没有。

显然,某种形式的猴子修补正在进行中,并且受导入是否完成的影响。这可能不是每个研究此问题的人的情况,但是对于我正在工作的狭窄环境,这就是我一直在寻找的答案。


这与其他(社区)评论一致,该评论说distutils应该monkeypatch setuptools,并且在安装Ansible时遇到问题。Ansible过去似乎曾尝试允许不使用setuptools进行安装,然后再进行讨论。

https://github.com/ansible/ansible/blob/devel/setup.py

很多东西都悬而未决...但是,如果您正在寻找一个简单项目的简单答案,则可能应该只导入setuptools。


1
import setuptoolspython上的ubuntu 16.04上,添加奇迹般地为我解决了这个问题。
kuropan

8

这是distutils发出的警告,表示您没有安装setuptools。从http://pypi.python.org/pypi/setuptools安装它会删除警告。


32
安装了setuptools。仍然有警告。
泰勒·朗

没错,即使安装了setuptools或distribution,我也会在Python 2.6.6中收到此错误。如果我尝试使用2.7.2,它就消失了。
FredrikHåård2011年

4
我在python 2.7.3中遇到了这个问题
Calvin Cheng

2
这对我有用:wget bootstrap.pypa.io/ez_setup.py -O-| sudo python
radtek

谢谢@radtek,它也为我工作。也许您可以将自己的评论变成答案?
Esteis 2015年

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

它将安装所有缺少的标题。它解决了我的问题


4

结论

distutils不支持install_requiresentry_pointssetuptools不。

变化from distutils.core import setupsetup.pyfrom setuptools import setup或重构你的setup.py只使用distutils功能。

我来这里是因为我没有意识到entry_points只是一个setuptools功能。

如果你在这里想转换setuptoolsdistutils像我这样的:

  1. install_requiressetup.py中删除,然后仅将requirements.txtpip
  2. 更改entry_pointsscriptsdoc)并重构所有依赖于entry_points带有shebang和入口点的完整脚本的模块。

我试图了解什么是推荐的包装。您编写“仅使用distutils功能”,也“将setuptools转换为distutils”,但同时声明“ entry_points仅是setuptools功能”,似乎有点矛盾?
chrisinmtown

2

据我所知,这是setuptools中的一个错误,在调用标准库中的基类之前,它没有删除setuptools的特定选项:https ://bitbucket.org/pypa/setuptools/issue/29 /避免在调用时发出用户警告

如果你有一个无条件的import setuptools在你setup.py(你应该如果使用setuptools的特定选项),那么实际上脚本没有与失败ImportError表明,setuptools的安装是否正确。

您可以按以下方式使警告静音:

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

只要当您使用无条件导入执行此操作,如果未安装setuptools,导入将完全失败:)

(我在合并后setuptools存储库的签出中看到了相同的行为,这就是为什么我确信这是setuptools错误而不是系统配置问题的原因。我希望合并前分发也会有同样的问题)


0

我现在已经在使用Python2.7的旧版工具中看到了这一点,在该版本中,构建(如Dockerfile)安装了非固定的依赖项,例如pytest。PyTest放弃了对Python 2.7的支持,因此您可能需要指定版本<新软件包的发行版。

或者咬紧牙关,然后将该应用程序转换为Python 3(如果可行)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.