问题:pypi UserWarning:未知分发选项:“ install_requires”
执行python setup.py install
PyPI包时,有人会遇到此警告吗?
install_requires
定义软件包的要求。许多PyPI软件包都有此选项。怎么可能是“未知分发选项”?
回答 0
python setup.py
使用不支持install_requires的distutils。setuptools这样做,还分发(它的后继),而pip(使用这两者之一)这样做。但是实际上您必须使用它们。即通过easy_install
命令或调用setuptools pip install
。
另一种方法是从setup.py中的setuptools导入安装程序,但这不是标准方法,这使得每个想要使用您的软件包的人都必须安装setuptools。
回答 1
这是我的Google搜索的第一个结果,但没有答案。我发现升级setuptools可以为我解决问题(并且可以通过点子获得很好的效果)
pip install --upgrade pip
pip install --upgrade setuptools
希望这有助于下一个人找到此链接!
回答 2
注意!注意!前面的答案不完善。要获取有关Python宇宙中包装状态的“最新备忘”,请阅读此相当详细的文章。
我刚尝试构建/安装ansible时遇到了这个问题。问题似乎是distutils确实不支持 install_requires。Setuptools 应该动态地对distutils进行Monkey补丁,但事实并非如此,这可能是因为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。
回答 3
我在使用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
,只是导入它会更改行为,以使其不再发出警告。对我来说,这是造成真正莫名其妙的差异的原因,其中我正在使用的某些项目发出这些警告,而另一些则没有。
显然,某种形式的Monkey修补正在进行中,并且受导入是否完成的影响。这可能不是每个研究此问题的人的情况,但是对于我正在工作的狭窄环境,这就是我一直在寻找的答案。
这与其他(社区)评论一致,该评论说distutils应该monkeypatch setuptools,并且在安装Ansible时遇到问题。Ansible过去似乎曾尝试允许不使用setuptools进行安装,然后再进行讨论。
https://github.com/ansible/ansible/blob/devel/setup.py
很多东西都悬而未决…但是,如果您正在寻找一个简单项目的简单答案,则可能应该只导入setuptools。
回答 4
这是distutils发出的警告,表示您没有安装setuptools。从http://pypi.python.org/pypi/setuptools安装它会删除警告。
回答 5
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
它将安装所有缺少的标题。它解决了我的问题
回答 6
结论:
distutils
不支持install_requires
或entry_points
,setuptools
不。
变化from distutils.core import setup
在setup.py到from setuptools import setup
或重构你的setup.py只使用distutils
功能。
我来这里是因为我没有意识到entry_points
只是一个setuptools
功能。
如果你在这里想转换setuptools
到distutils
像我这样的:
install_requires
从setup.py中删除,然后仅将requirements.txt与pip
- 更改
entry_points
为scripts
(doc)并重构所有依赖于entry_points
带有shebang和入口点的完整脚本的模块。
回答 7
据我所知,这是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错误而不是系统配置问题的原因。我希望合并前分发也会有同样的问题)
回答 8
我现在已经在使用Python2.7的旧版工具中看到了这一点,在该版本中,构建(如Dockerfile)安装了非固定的依赖项,例如pytest。PyTest放弃了对Python 2.7的支持,因此您可能需要指定版本<新软件包的发行版。
或者咬紧牙关,然后将该应用程序转换为Python 3(如果可行)。