setup.py构建依赖NumPy的C扩展时如何配置头文件包含路径
解决方案
别硬写死本地NumPy头文件的绝对路径,NumPy自带了获取当前环境头文件目录的接口,配合构建依赖声明就能适配所有用户的安装环境。
具体改法
- 用
numpy.get_include()获取头文件路径:这个函数会直接返回当前Python环境里NumPy头文件的绝对存放路径,编译需要的numpy/ndarraytypes.h就在这个路径下,直接填到include_dirs参数里就行,不用管用户是装在系统目录、虚拟环境、还是不同操作系统、不同NumPy版本,都能拿到正确路径。 - 补全构建依赖配置:要保证运行setup.py的编译逻辑前,NumPy已经装好,不然导入numpy的时候会直接报错。
改完的setup.py可以直接跨环境用,代码如下:
from setuptools import setup, Extension import numpy if __name__ == "__main__": setup( name="myPack", setup_requires=[ "numpy>=1.22.3", ], install_requires=[ "numpy>=1.22.3", ], ext_modules=[ Extension( 'npufunc', sources=['npufunc.c'], include_dirs=[ numpy.get_include() ] ), ] )
推荐兼容性优化
现在新版pip、PyPI的构建流程都遵循PEP 517标准,建议在项目根目录加个pyproject.toml文件提前声明构建依赖,比单纯用setup_requires的兼容性好很多,不会出现构建顺序错乱的问题,配置内容:
[build-system] requires = ["setuptools>=42", "wheel", "numpy>=1.22.3"] build-backend = "setuptools.build_meta"
加完这个配置后,pip装你的包的时候会先建一个隔离的构建环境,自动把列表里的构建依赖都装好,再跑C扩展的编译流程,基本不会出现找不到头文件、导入失败的问题。
内容的提问来源于stack exchange,提问作者Rikard Olsson
相关产品推荐
相关产品推荐

