M1 Mac上Python3.7环境下用Poetry安装Numpy报EnvCommandError
M1 Mac + Python 3.7 + Poetry 环境下安装Numpy失败问题
问题描述
在M1 Mac的Python 3.7 Poetry环境中安装Numpy时,反复出现EnvCommandError,无法构建wheel,且遇到clang不支持-march=native参数的错误。
已尝试方案
- 通过Rosetta启动终端,使用pip加x86架构参数安装
- 通过Rosetta启动终端,使用Poetry安装
- 用Brew安装OPENBlas并设置路径后尝试安装
- 克隆Numpy源码,使用
--no-binary和--no-pep517参数安装 - 更新至最新版本的Poetry后尝试安装
错误信息
警告:尝试进行相对导入,但未知父包 /private/var/folders/g8/n76149jx1_s8bmqh02_lsmnh0000gp/T/pip-build-env-9yu5k12r/overlay/lib/python3.7/site-packages/setuptools/_distutils/dist.py:275: 用户警告:未知的分发选项:'define_macros' warnings.warn(msg) 错误:命令 "clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -I/opt/homebrew/opt/openssl@3/include -DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-12.2-arm64-3.7/numpy/core/src/common -Ibuild/src.macosx-12.2-arm64-3.7/numpy/core/src/umath -Inumpy/core/include -Ibuild/src.macosx-12.2-arm64-3.7/numpy/core/include/numpy -Ibuild/src.macosx-12.2-arm64-3.7/numpy/distutils/include -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -Inumpy/core/src/_simd -I/Users/maxnguyen/Library/Caches/pypoetry/virtualenvs/dataflow-ieQly66s-py3.7/include -I/Users/maxnguyen/.pyenv/versions/3.7.12/include/python3.7m -Ibuild/src.macosx-12.2-arm64-3.7/numpy/core/src/common -Ibuild/src.macosx-12.2-arm64-3.7/numpy/core/src/npymath -c build/src.macosx-12.2-arm64-3.7/numpy/core/src/umath/loops_unary_fp.dispatch.c -o build/temp.macosx-12.2-arm64-3.7/build/src.macosx-12.2-arm64-3.7/numpy/core/src/umath/loops_unary_fp.dispatch.o -MMD -MF build/temp.macosx-12.2-arm64-3.7/build/src.macosx-12.2-arm64-3.7/numpy/core/src/umath/loops_unary_fp.dispatch.o.d -I/System/Library/Frameworks/vecLib.framework/Headers" 执行失败,退出状态码1 [输出结束] 注意:此错误源自子进程,大概率不是pip的问题。 ERROR: 构建numpy的wheel失败 构建numpy失败 ERROR: 无法为numpy构建wheel,而这是安装基于pyproject.toml的项目所必需的 在 ~/.poetry/lib/poetry/utils/env.py:1195 中的 _run 方法 1191│ output = subprocess.check_output( 1192│ cmd, stderr=subprocess.STDOUT, **kwargs 1193│ ) 1194│ except CalledProcessError as e: → 1195│ raise EnvCommandError(e, input=input_) 1196│ 1197│ return decode(output) 1198│ 1199│ def execute(self, bin, *args, **kwargs):
解决建议
- 指定兼容M1的Numpy版本
Python3.7在M1上没有官方预编译的高版本Numpy wheel,尝试安装numpy==1.21.6(这是最后一个支持Python3.7且兼容arm64的稳定版本)。在pyproject.toml中指定版本后执行:
poetry lock && poetry install
- 强制使用预编译wheel
设置环境变量让pip优先获取预编译包,在终端执行:
export PIP_ONLY_BINARY=numpy poetry install
若通过Rosetta运行,需确保环境变量在x86架构终端中生效。
- 禁用
-march=native编译参数
创建或修改~/.numpy-site.cfg文件,添加以下内容:
[atlas] atlas_libs = [lapack] lapack_libs = [blas] blas_libs =
同时设置编译环境变量后重新安装:
export CFLAGS="-arch arm64 -O3 -Wno-unused-result" export CXXFLAGS="-arch arm64 -O3 -Wno-unused-result" poetry install
- 用pyenv配合Rosetta管理x86架构Python3.7
确保使用纯x86环境安装和运行:
- 用Rosetta打开终端
- 安装x86版本的pyenv:
arch -x86_64 brew install pyenv - 安装x86架构的Python3.7:
arch -x86_64 pyenv install 3.7.12 - 设置本地环境为该版本:
pyenv local 3.7.12 - 重新创建Poetry虚拟环境:
poetry env use $(which python),再执行poetry install
内容的提问来源于stack exchange,提问作者mx-ng
相关产品推荐
相关产品推荐

