有人在执行 PyPI 包的 python setup.py install时遇到过这种警告吗?
python setup.py install
install_requires定义了包需要什么。许多 PyPI 包都有这个选项。它怎么会是一个“未知的分配选项”?
install_requires
这是 distutils 发出的警告,表明您没有安装 setuptools。 从 http://pypi.python.org/pypi/setuptools安装它将删除警告。
注意!请注意!未来的答案不完美。要了解 Python 环境中打包状态的“最新备忘录”,请阅读 这篇相当详细的文章。
我在尝试构建/安装 anable 时遇到了这个问题。问题似乎是 distutils 实际上是 不支持 install _ need。Setuptools 应该 Monkey-patch distutils 动态运行,但它没有,可能是因为 Setuptools 的上一个版本是2009年的0.6 c11,而 distutils 是一个核心的 Python 项目。
因此,即使在手动安装 setuptools-0.6 c11-py2.7. egg 运行 setup.py 之后,也只能获取 distutils dist.py,而不能获取 site-package/setuptools/中的命令。
还有 setuptools 文档提示如何使用 Ez _ setup而不是 distutils。
然而,目前 setuptools 本身是由 分发提供的,而 setuptools ()的风格支持 install _ need。
python setup.py使用了不支持 install _ need 的 distutils。Setuptools 做,也分发(它的继承者) ,和 pip (使用任何一种)做。但实际上你必须使用它们。即通过 easy_install命令或 pip install调用 setuptools。
python setup.py
easy_install
pip install
另一种方法是从 setup.py 中的 setuptools 导入安装程序,但这不是标准做法,因此想要使用您的包的每个人都必须安装 setuptools。
据我所知,这是 setuptools 中的一个 bug,它没有在调用标准库中的基类 https://bitbucket.org/pypa/setuptools/issue/29/avoid-userwarnings-emitted-when-calling之前删除 setuptools 的特定选项
如果在 setup.py中有一个无条件的 import setuptools(如果使用 setuptools 的特定选项,那么应该这样做) ,那么 ImportError中脚本没有失败的事实表明 setuptools 安装正确。
setup.py
import setuptools
ImportError
您可以按以下方式禁止发出警告:
python -W ignore::UserWarning:distutils.dist setup.py <any-other-args>
如果使用无条件导入,只有 这样做,如果没有安装 setuptools,导入将完全失败:)
(我在合并后 setuptools 回购的结账中看到了同样的行为,这就是为什么我确信这是 setuptools 的错误,而不是系统配置问题。我希望合并前分发也会有同样的问题)
sudo apt-get install python-dev # for python2.x installs sudo apt-get install python3-dev # for python3.x installs
它会安装所有丢失的头文件,解决了我的问题
我在 Mac 上用的是 python 2.7.11。我一直在尝试创建非常简单和直接的项目,其中我唯一的要求是能够运行 python setup.py install,并让 setup.py使用 setup 命令,最好是从 distutils。除了我在这里提到的 kwargs 到 setup()之外,没有任何其他的导入或代码。
setup()
当 setup.py文件的导入为:
from distutils.core import setup
当我使用它时,会得到如下警告
/usr/local/Cellar/python/2.7.11/Framework/Python.Framework/Versions/2.7/lib/python2.7/distutils/dist.py: 267: 用户警告: 未知的分发选项: ‘ entry _ points’ 警告
如果我将导入(和 没别的了)更改为以下内容:
from distutils.core import setup import setuptools # noqa
警告消失了。
注意,我没有使用 setuptools,只是使用 进口,它改变了行为,不再发出警告。对我来说,这是一个真正令人困惑的差异的原因,我使用的一些项目给出了这些警告,而另一些则没有。
setuptools
显然,某种形式的猴子修补程序正在进行,并且它受到是否完成该导入的影响。对于每个研究这个问题的人来说,这可能不是一个好的情况,但是对于我工作的狭窄环境来说,这就是我所寻找的答案。
这与其他(社区)评论一致,其中指出 distutils 应该对 setuptools 进行 monkeypatch 修补,并且他们在安装 Anble 时遇到了问题。Anble 似乎在过去尝试过在不使用 setuptools 的情况下允许安装,然后又回到了这一点。
Https://github.com/ansible/ansible/blob/devel/setup.py
很多东西都是悬而未决的... ... 但是如果您正在为一个简单的项目寻找一个简单的答案,那么您可能只需要导入 setuptools。
这是我在谷歌上搜索的第一个结果,但是没有答案。 我发现升级 setuptools 对我来说解决了这个问题(并且很好地解决了 pip 问题)
pip install --upgrade pip pip install --upgrade setuptools
希望这能帮助下一个人找到这个链接!
我现在在使用 Python2.7的遗留工具中看到了这一点,其中构建(如 Dockerfile)安装了一个未固定的依赖项,例如 pytest。PyTest 已经放弃了对 Python 2.7的支持,因此您可能需要指定 version < the new package release。
或者咬紧牙关,如果可行的话,将该应用程序转换为 Python3。
结论 :
distutils不支持 install_requires或 entry_points,而 setuptools支持。
distutils
entry_points
改变 Setup.py中的 from distutils.core import setup到 from setuptools import setup或者重构你的 Setup.py到只使用 distutils特性。
from setuptools import setup
我来这里是因为我没有意识到 entry_points只是一个 setuptools的功能。
如果你在这里想像我一样把 setuptools转换成 distutils:
pip
scripts
如果你按照官方文件的要求去做的话,它会工作得很好:
import setuptools setuptools.setup(...)
资料来源: https://packaging.python.org/tutorials/packaging-projects/#creating-setup-py