Python 3.11.0下无法通过Poetry安装scikit-learn的问题
安装scikit-learn遇KeyError: 'headers'问题解决
环境配置
poetry: 1.2.2 pyenv: 2.3.5-3-g0726e02e python: 3.11.0 目标安装版本scikit-learn: 1.1.2
问题现象
执行poetry add scikit-learn时触发元数据生成错误,核心报错如下:
Preparing metadata (pyproject.toml): still running... Preparing metadata (pyproject.toml): finished with status 'error' error: subprocess-exited-with-error × Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [273 lines of output] Partial import of sklearn during the build process. setup.py:128: DeprecationWarning: `numpy.distutils` is deprecated since NumPy 1.23.0, as a result of the deprecation of `distutils` itself. It will be removed for Python >= 3.12. For older Python versions it will remain present. It is recommended to use `setuptools < 60.0` for those Python versions. .... .... .... self.finalize_unix() File "/tmp/pip-build-env-go8f9tm1/overlay/lib/python3.11/site-packages/setuptools/_distutils/command/install.py", line 498, in finalize_unix self.select_scheme("posix_prefix") File "/tmp/pip-build-env-go8f9tm1/overlay/lib/python3.11/site-packages/setuptools/_distutils/command/install.py", line 528, in select_scheme return self._select_scheme(resolved) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/pip-build-env-go8f9tm1/overlay/lib/python3.11/site-packages/setuptools/_distutils/command/install.py", line 537, in _select_scheme setattr(self, attrname, scheme[key]) ~~~~~~^^^^^ KeyError: 'headers' [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed
已尝试操作
- 执行
poetry run pip install setuptools==59.8.0降级setuptools,但再次执行poetry add scikit-learn时,Poetry会自动将setuptools升级至65.0.x版本,导致安装失败。 - 环境中单独安装numpy、pandas、scipy等库无问题,无需降级setuptools。
解决方法
方法1:锁定setuptools版本到pyproject.toml
- 在项目的
pyproject.toml中添加setuptools的版本锁定:
[tool.poetry.dependencies] # 保留你已有的其他依赖,新增以下行 setuptools = "==59.8.0"
- 执行
poetry lock --no-update生成锁定文件,避免Poetry自动升级setuptools。 - 最后执行
poetry add scikit-learn==1.1.2完成安装。
方法2:指定构建环境的setuptools版本
在pyproject.toml中添加构建系统配置,强制构建时使用指定版本的setuptools:
[build-system] requires = ["setuptools==59.8.0", "wheel"] build-backend = "setuptools.build_meta"
配置完成后直接执行poetry add scikit-learn==1.1.2即可。
方法3:升级Poetry版本
你当前使用的Poetry 1.2.2版本较旧,可能存在依赖处理逻辑缺陷。执行以下命令升级到最新稳定版:
poetry self update
升级后再尝试poetry add scikit-learn==1.1.2,新版本Poetry可能自动兼容这类依赖冲突。
方法4:直接安装预编译轮子包
如果上述方法都无效,绕开元数据构建流程,直接用pip安装预编译的scikit-learn轮子包:
poetry run pip install scikit-learn==1.1.2 --only-binary :all:
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

