【问题标题】:pypi UserWarning: Unknown distribution option: 'install_requires'pypi UserWarning:未知的分发选项:'install_requires'
【发布时间】:2012-01-07 21:36:32
【问题描述】:

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

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

【问题讨论】:

  • @tripleee 也许,但这个问题比那个问题更早被问到。
  • Question age is a secondary concern 但无论哪种方式我都没有强烈的意见。如果您希望重复提名反过来,可以创建一个Meta Stack Overflow 问题以提高知名度。就我个人而言,另一个问题的接受答案对我帮助更大,因为它更直接、更集中。您似乎从未接受过这些答案中的任何一个,所以这是您实际上可以改变的一个因素。
  • @tripleee 如果您仔细阅读此主题,您会发现根本没有完美的答案。所以我不知道该接受哪个答案。我不想通过选择一个甚至无法说服自己的答案来误导人们。
  • 请按照官方文档使用import setuptools; setuptools.setup()。见:packaging.python.org/tutorials/packaging-projects/…

标签: python distutils pypi


【解决方案1】:

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

【讨论】:

  • 安装工具已安装。仍然有警告。
  • 你说的很对,我在 Python 2.6.6 中遇到了这个错误,即使安装了 setuptools 或 Distribute。如果我尝试使用 2.7.2,它就消失了。
  • 我在 python 2.7.3 中遇到了这个问题
  • 这是为我做的:wget bootstrap.pypa.io/ez_setup.py -O - |须藤蟒蛇
  • 谢谢@radtek,这也对我有用。也许您可以将您的评论变成答案?
【解决方案2】:

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

我在尝试构建/安装 ansible 时遇到了这个问题。问题似乎是 distutils 真的是doesn't support install_requires。 Setuptools should monkey-patch distutils on-the-fly,但它没有,可能是因为 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。

【讨论】:

  • 投反对票,因为这个答案包含一些关于不同事物是什么的虚假信息和混淆。例如,ez_setup.py 是 setuptools 的引导安装程序,而不是使用 distutils 的东西。大多数 PyPI 包并非“完全错误”。
  • @Iguananaut,感谢您查看答案;我已经编辑过了。
  • 太棒了,谢谢。在这种情况下,我会重新投票 :) 你链接到的 Nick Coghlan 的文章是我之前与我的同事分享过的一篇文章,试图让他们了解这些东西。
  • 关于 2013 年 3 月情况的好文章。一个问题... 作者指出:“setuptoolsdistribute 项目正在重新合并在一起,但合并还没有完成(我会尽快更新这篇文章)。”有谁知道截至2019年的情况是什么?随着 Python 2.7 生命周期结束日期的临近,许多 Python 包将处于更新和重新打包的过程中。
【解决方案3】:

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

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

【讨论】:

  • 假设我想使用pip,那么如果我只想就地构建扩展,我该如何运行setup.py文件?
  • 警告不会阻止您打包代码,因此您可以运行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
  • 查看我的答案 - 据我所知,这只是 setuptools 中的一个直接错误。用户没有做错任何事,setuptools 是。
  • 这间接回答了我的问题:由于运行pip install pendulum==1.4.4,我得到了错误。运行pip install setuptools --upgrade 清除了错误。
【解决方案4】:

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

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

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

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

只有如果您使用无条件导入,如果没有安装 setuptools 将完全失败:)

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

【讨论】:

    【解决方案5】:
    sudo apt-get install python-dev  # for python2.x installs
    sudo apt-get install python3-dev  # for python3.x installs
    

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

    【讨论】:

    • 在centOS8中使用dnf install python39-devel.x86_64解决了我无法安装uwsgi的问题
    【解决方案6】:

    我在使用 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:用户警告:未知分发选项:'entry_points' 警告.warn(msg)

    如果我将导入(并且没有别的)更改为以下内容:

    from distutils.core import setup
    import setuptools  # noqa
    

    警告消失。

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

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


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

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

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

    【讨论】:

    • 添加 import setuptools 也奇迹般地解决了我在 ubuntu 16.04 上使用 python 3.5 的问题。
    【解决方案7】:

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

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

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

    【讨论】:

    • 这也为我解决了。 (Python 3.4,尝试pip3 install neovim-remote。)
    • 这对我有用。试图在 Python 2.7.16 上安装 mako。有一个类似的未知分发选项。 Pip 没问题,但 setuptools 从 40.6.2 转到 41.0.1。然后 Mako 安装了 A-OK。
    【解决方案8】:

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

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

    【讨论】:

      【解决方案9】:

      总结

      distutils 不支持 install_requiresentry_pointssetuptools 支持。

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

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

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

      1. setup.py 中删除 install_requires,然后将 requirements.txtpip 一起使用
      2. entry_points 更改为scripts (doc) 并将依赖entry_points 的所有模块重构为带有shebangs 和入口点的完整脚本。

      【讨论】:

      • 我试图了解推荐的软件包是什么。你写“仅使用 distutils 功能”也“将 setuptools 转换为 distutils”,还说“entry_points 只是一个 setuptools 功能”,似乎有点矛盾?
      【解决方案10】:

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

      import setuptools
      setuptools.setup(...)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 2021-03-29
        • 2016-07-13
        • 2018-03-03
        • 2017-06-25
        • 1970-01-01
        • 2013-02-20
        相关资源
        最近更新 更多