pip install . 安装本地C++模块失败,但python3 setup.py install成功,提示找不到已安装的numpy
我太懂你这种困惑了——明明numpy已经好好装在全局环境里,直接跑python3 setup.py install能顺利编译安装你的tcore模块,但一用pip install .就报错找不到numpy,还跑去临时目录里瞎找,属实让人摸不着头脑。
问题根源
其实核心原因是pip构建wheel时会默认创建一个隔离的临时构建环境,这个环境和你平时用的全局Python环境是分开的,里面没有预装你全局的numpy。而直接运行setup.py是在当前的Python环境下执行的,自然能找到已经安装的numpy,所以两种方式会有差异。从报错日志里的路径也能看出来,pip用了/private/var/folders/9g/wy6m2s4d705fpzyr78yx0s9w0000gn/T/pip-build-env-1m0z9fie这类临时环境,这个环境里确实没有numpy,所以setup.py里的import numpy就直接失败了。
解决方案
给你两个可行的解决办法,推荐用第一种规范的方式:
1. 声明numpy为构建依赖(推荐)
你需要告诉pip,在构建你的模块之前,必须先安装numpy。现在主流的做法是用pyproject.toml文件来指定构建依赖:
在你的项目根目录创建一个pyproject.toml文件,内容如下:
[build-system] requires = ["setuptools", "wheel", "numpy"] build-backend = "setuptools.build_meta"
这样pip在启动构建流程前,会自动在隔离环境里安装好这些依赖,之后setup.py里的import numpy就能正常执行了。
如果你还是想通过setup.py来配置,可以用setup_requires参数(不过这个方式现在有点过时了):
from setuptools import setup, Extension def get_numpy_include(): # 延迟导入numpy,确保在setup_requires安装完numpy后再执行 import numpy return numpy.get_include() setup( name="tcore", version="1.0.0", setup_requires=['numpy'], ext_modules=[ Extension( 'tcore', sources=["你的C++源文件路径"], include_dirs=[get_numpy_include()], extra_compile_args=["-O3", "-std=c++23"] ) ] )
2. 临时禁用隔离构建环境
如果你只是临时想快速解决问题,可以给pip加--no-build-isolation参数,让它直接在当前Python环境里构建:
pip install . --no-build-isolation
不过这个方法不推荐长期使用,因为不符合现代Python包构建的规范,换个环境可能又会出问题。
验证
修改完配置后,再运行pip install .,应该就能顺利找到numpy并完成你的tcore模块的编译安装了。
备注:内容来源于stack exchange,提问作者PST

