python setup.py install
执行PyPI 包时是否有人遇到此警告?
install_requires
定义包需要什么。很多 PyPI 包都有这个选项。它怎么可能是“未知的分发选项”?
python setup.py
使用不支持 install_requires 的 distutils。setuptools 确实,也分发(它的继任者)和 pip(使用其中之一)。但你实际上必须使用它们。即通过命令调用 setuptoolseasy_install
或pip install
.
另一种方法是从 setup.py 中的 setuptools 导入设置,但这不是标准的,并且每个想要使用您的包的人都必须安装 setuptools。
这是我谷歌搜索的第一个结果,但没有答案。我发现升级 setuptools 为我解决了这个问题(并且 pip 很好)
pip install --upgrade pip
pip install --upgrade setuptools
希望这有助于下一个人找到此链接!
我在带有 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'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。
注意!注意!前面的答案不完美。要获得有关 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。
这是来自 distutils 的警告,表明您没有安装 setuptools。从http://pypi.python.org/pypi/setuptools安装它会删除警告。
总之:
distutils
不支持install_requires
或entry_points
,支持setuptools
。
将setup.py更改为from distutils.core import setup
或重构您的setup.py以仅使用功能。from setuptools import setup
distutils
我来到这里是因为我没有意识到entry_points
这只是一个setuptools
功能。
如果您在这里想转换setuptools
为distutils
像我一样:
install_requires
从setup.py中删除并使用requirements.txtpip
entry_points
为scripts
( doc ) 并将依赖的任何模块重构entry_points
为带有 shebangs 和入口点的完整脚本。sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
它将安装任何缺少的标头。它解决了我的问题
据我所知,这是 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 存储库的结帐中看到了同样的行为,这就是为什么我确信这是 setuptools 错误而不是系统配置问题。我希望合并前分发也会有同样的问题)
如果您遵循官方文档,它可以正常工作:
import setuptools
setuptools.setup(...)
来源:https ://packaging.python.org/tutorials/packaging-projects/#creating-setup-py
我现在已经在使用 Python2.7 的遗留工具中看到了这一点,其中构建(如 Dockerfile)安装了未固定的依赖项,例如 pytest。PyTest 已放弃对 Python 2.7 的支持,因此您可能需要指定版本 < 新包版本。
或者如果可行的话,硬着头皮将该应用程序转换为 Python 3。