pypi UserWarning:未知的分发选项:'install_requires'

时间:2011-11-28 12:13:17

标签: python distutils pypi

执行PyPI包的python setup.py install时是否有人遇到此警告?

install_requires定义了包所需的内容。很多PyPI包都有这个选项。它怎么可能是一个“未知的分发选项”?

10 个答案:

答案 0 :(得分:76)

python setup.py使用不支持install_requires的distutils。 setuptools做,也分发(它的继承者),和pip(使用其中任何一个)做。但你实际上必须使用它们。即通过easy_install命令或pip install调用setuptools。

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

答案 1 :(得分:15)

<强>注意!的注意!前面的答案不完整。要获取有关Python Universe中打包状态的“最新备忘录”,请阅读this fairly detailed essay

我在尝试构建/安装ansible时遇到了这个问题。问题似乎是distutils真的doesn't support install_requires。 Setuptools should猴子补丁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本身由distribute提供,而setup()的风格支持install_requires。

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:8)

我在使用python 2.7.11的Mac上。我一直在努力创建非常简单和直接的项目,我唯一的要求是我可以运行python setup.py install,并setup.py使用setup命令,理想情况下来自distutils。除了我在这里注意到的内容之外,除了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:UserWarning:未知发行选项:&#39; entry_points&#39;     warnings.warn(MSG)

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

from distutils.core import setup
import setuptools  # noqa

警告消失了。

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

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

这与其他(社区)评论一致,该评论表示distutils应该monkeypatch setuptools,并且他们在安装Ansible时遇到了问题。 Ansible似乎试图在过去没有安装工具的情况下允许安装,然后重新开始。

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

很多东西都在空中......但如果您正在为一个简单的项目寻找一个简单的答案,那么您应该只需要导入setuptools。

答案 4 :(得分:7)

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

答案 5 :(得分:4)

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

它将安装任何缺少的标头。它解决了我的问题

答案 6 :(得分:2)

据我所知,这是setuptools中的一个错误,它在调用标准库中的基类之前没有删除setuptools特定选项:https://bitbucket.org/pypa/setuptools/issue/29/avoid-userwarnings-emitted-when-calling

如果import setuptools中有无条件setup.py(如果使用setuptools特定选项,则应如此),那么脚本未通过ImportError失败的事实表明setuptools已正确安装。

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

python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>
如果您使用无条件导入,如果未安装setuptools,

执行此操作:)

(我在合并后的setuptools repo的结账时看到了同样的行为,这就是为什么我有信心这是一个setuptools bug而不是系统配置问题。我希望合并前的分发会有相同的问题)

答案 7 :(得分:1)

总结

distutils不支持install_requiresentry_pointssetuptools不支持。

setup.py 中的from distutils.core import setup更改为from setuptools import setup,或重构您的 setup.py 以仅使用distutils功能。< / p>

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

如果您想在这里像我一样将setuptools转换为distutils

  1. setup.py 中删除install_requires,只需将 requirements.txt pip
  2. 一起使用
  3. entry_points更改为scriptsdoc),并将依赖于entry_points的所有模块重构为带有shebang和入口点的完整脚本。

答案 8 :(得分:0)

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

或者咬紧牙关,如果可行的话,将该应用程序转换为Python 3。

答案 9 :(得分:0)

如果遵循官方文档,它会很好地工作:

import setuptools
setuptools.setup(...)

来源:https://packaging.python.org/tutorials/packaging-projects/#creating-setup-py