MacOS下Python3.9安装scikit-learn==1.0遇distutils.msvccompiler缺失错误
问题描述
在Mac系统上通过pipenv创建的虚拟环境中安装scikit-learn==1.0时,出现ModuleNotFoundError: No module named 'distutils.msvccompiler'错误。当前setuptools版本为69.5.1,尝试降级到59.1仍未解决,且该错误在Windows系统中不会出现,需了解Mac系统对此问题的影响及解决办法。
完整报错信息:
Collecting scikit-learn==1.0 Using cached scikit-learn-1.0.tar.gz (7.8 MB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... error error: subprocess-exited-with-error × Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [23 lines of output] Partial import of sklearn during the build process. Traceback (most recent call last): File "/Users/FFIROUZA/.local/share/virtualenvs/predmaint-5-6S7_mY/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> main() File "/Users/FFIROUZA/.local/share/virtualenvs/predmaint-5-6S7_mY/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main json_out['return_val'] = hook(**hook_input['kwargs']) File "/Users/FFIROUZA/.local/share/virtualenvs/predmaint-5-6S7_mY/lib/python3.9/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 149, in prepare_metadata_for_build_wheel return hook(metadata_directory, config_settings) File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 376, in prepare_metadata_for_build_wheel self.run_setup() File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 521, in run_setup super().run_setup(setup_script=setup_script) File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 319, in run_setup exec(code, locals()) File "<string>", line 319, in <module> File "<string>", line 311, in setup_package File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/numpy/distutils/core.py", line 24, in <module> from numpy.distutils.command import config, config_compiler, \ File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/numpy/distutils/command/config.py", line 19, in <module> from numpy.distutils.mingw32ccompiler import generate_manifest File "/private/var/folders/yw/w0vbj__56k7gswchtmvkr_fc0000gp/T/pip-build-env-040c2b1w/overlay/lib/python3.9/site-packages/numpy/distutils/mingw32ccompiler.py", line 29, in <module> from distutils.msvccompiler import get_build_version as get_build_msvc_version ModuleNotFoundError: No module named 'distutils.msvccompiler' [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details.
原因分析
distutils.msvccompiler是Windows平台专属模块,用于处理MSVC编译器相关逻辑,Mac系统不存在该模块,也不需要它。- 报错根源是旧版本
scikit-learn==1.0依赖的numpy.distutils存在跨平台兼容性bug:在Mac环境下错误地尝试导入仅Windows可用的模块,触发找不到模块的错误。
解决办法
强制安装预编译wheel包(优先推荐):
直接跳过源码编译步骤,使用Mac平台预编译的二进制包,执行命令:pip install scikit-learn==1.0 --only-binary :all:该命令会强制pip下载预编译的wheel,避免触发错误的源码构建逻辑。
补全Python环境的distutils组件:
- 如果用Homebrew安装的Python3.9,重新安装以补全完整组件:
brew reinstall python@3.9 - 如果是系统自带Python,安装Xcode命令行工具补全编译依赖:
xcode-select --install
- 如果用Homebrew安装的Python3.9,重新安装以补全完整组件:
升级numpy版本后再安装:
旧版本numpy.distutils的跨平台判断逻辑有问题,先升级numpy到兼容版本,再安装scikit-learn:pip install numpy>=1.21 pip install scikit-learn==1.0
内容的提问来源于stack exchange,提问作者Farzaneh
相关产品推荐
相关产品推荐

