127

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

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

4

10 回答 10

99

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

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

于 2012-05-21T13:28:57.037 回答
55

这是我谷歌搜索的第一个结果,但没有答案。我发现升级 setuptools 为我解决了这个问题(并且 pip 很好)

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

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

于 2018-08-22T14:36:25.837 回答
20

我在带有 python 2.7.11 的 Mac 上。我一直在玩弄创建极其简单和直接的项目,我唯一的要求是我可以运行python setup.py installsetup.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:用户警告:未知分发选项:'entry_points'warnings.warn(味精)

如果我将导入(仅此而已)更改为以下内容:

from distutils.core import setup
import setuptools  # noqa

警告消失。

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

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


这与另一个(社区)评论一致,该评论说 distutils 应该对 setuptools 进行猴子补丁,并且他们在安装 Ansible 时遇到了问题。Ansible 似乎过去曾尝试在没有 setuptools 的情况下允许安装,然后又继续这样做。

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

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

于 2018-06-06T13:55:46.160 回答
17

注意注意!前面的答案不完美。要获得有关 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。

于 2012-05-21T09:44:46.970 回答
8

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

于 2011-11-28T15:38:57.117 回答
7

总之

distutils不支持install_requiresentry_points,支持setuptools

setup.py更改为from distutils.core import setup或重构您的setup.py以仅使用功能。from setuptools import setupdistutils

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

如果您在这里想转换setuptoolsdistutils像我一样:

  1. install_requiressetup.py中删除并使用requirements.txtpip
  2. 更改entry_pointsscripts( doc ) 并将依赖的任何模块重构entry_points为带有 shebangs 和入口点的完整脚本。
于 2019-10-04T00:45:05.777 回答
6
sudo apt-get install python-dev  # for python2.x installs
sudo apt-get install python3-dev  # for python3.x installs

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

于 2017-07-17T13:49:44.700 回答
2

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

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

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

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

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

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

于 2013-07-02T12:34:59.353 回答
0

如果您遵循官方文档,它可以正常工作:

import setuptools
setuptools.setup(...)

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

于 2020-09-10T20:21:00.363 回答
0

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

或者如果可行的话,硬着头皮将该应用程序转换为 Python 3。

于 2019-07-23T16:23:36.273 回答