执行PyPI包的python setup.py install
时是否有人遇到此警告?
install_requires
定义了包所需的内容。很多PyPI包都有这个选项。它怎么可能是一个“未知的分发选项”?
答案 0 :(得分:76)
python setup.py
使用不支持install_requires的distutils。 setuptools做,也分发(它的继承者),和pip(使用其中任何一个)做。但你实际上必须使用它们。即通过easy_install
命令或pip install
调用setuptools。
另一种方法是从setup.py中的setuptools导入设置,但这不是标准的,并且每个想要使用你的软件包的人都必须安装setuptools。
答案 1 :(得分:15)
<强>注意强>!的注意强>!前面的答案不完整。要获取有关Python Universe中打包状态的“最新备忘录”,请阅读this fairly detailed essay。
我在尝试构建/安装ansible时遇到了这个问题。问题似乎是distutils真的doesn't support install_requires。 Setuptools should猴子补丁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本身由distribute提供,而setup()的风格支持install_requires。
答案 2 :(得分:12)
这是我的Google搜索的第一个结果,但没有答案。 我发现升级setuptools可以为我解决问题(并且可以通过点子获得很好的效果)
pip install --upgrade pip
pip install --upgrade setuptools
希望这有助于下一个人找到此链接!
答案 3 :(得分:8)
我在使用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:UserWarning:未知发行选项:&#39; entry_points&#39; warnings.warn(MSG)
如果我将导入(以及其他)更改为以下内容:
from distutils.core import setup
import setuptools # noqa
警告消失了。
请注意,我没有使用setuptools
,只是导入它会更改行为,使其不再发出警告。对我来说,这是一个真正莫名其妙的差异的原因,我使用的一些项目给出了这些警告,而另一些则没有。
显然,正在进行某种形式的猴子修补,并且它是否受到导入的影响。对于每个研究这个问题的人来说,情况可能并非如此,但对于我工作的狭窄环境,这就是我一直在寻找的答案。
这与其他(社区)评论一致,该评论表示distutils应该monkeypatch setuptools,并且他们在安装Ansible时遇到了问题。 Ansible似乎试图在过去没有安装工具的情况下允许安装,然后重新开始。
https://github.com/ansible/ansible/blob/devel/setup.py
很多东西都在空中......但如果您正在为一个简单的项目寻找一个简单的答案,那么您应该只需要导入setuptools。
答案 4 :(得分:7)
这是来自distutils的警告,表示您没有安装setuptools。 从http://pypi.python.org/pypi/setuptools安装它将删除警告。
答案 5 :(得分:4)
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
它将安装任何缺少的标头。它解决了我的问题
答案 6 :(得分:2)
据我所知,这是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 repo的结账时看到了同样的行为,这就是为什么我有信心这是一个setuptools bug而不是系统配置问题。我希望合并前的分发会有相同的问题)
答案 7 :(得分:1)
总结:
distutils
不支持install_requires
或entry_points
,setuptools
不支持。
将 setup.py 中的from distutils.core import setup
更改为from setuptools import setup
,或重构您的 setup.py 以仅使用distutils
功能。< / p>
我之所以来到这里是因为我没有意识到entry_points
只是一个setuptools
功能。
如果您想在这里像我一样将setuptools
转换为distutils
:
install_requires
,只需将 requirements.txt 与pip
entry_points
更改为scripts
(doc),并将依赖于entry_points
的所有模块重构为带有shebang和入口点的完整脚本。答案 8 :(得分:0)
我现在已经在使用Python2.7的旧版工具中看到了这一点,其中一个版本(如Dockerfile)安装了非固定的依赖项,例如pytest。 PyTest放弃了对Python 2.7的支持,因此您可能需要指定版本<新软件包的发行版。
或者咬紧牙关,如果可行的话,将该应用程序转换为Python 3。
答案 9 :(得分:0)
如果遵循官方文档,它会很好地工作:
import setuptools
setuptools.setup(...)
来源:https://packaging.python.org/tutorials/packaging-projects/#creating-setup-py