使用setuptools编译Numba AOT生成.pyd,导入时为何触发重编译?
Numba pycc编译后导入异常的修复方案
问题根源
你当前的setup.py错误地使用了setuptools的Extension类来处理Numba pycc脚本。Numba的CC模块本身就是用来生成编译扩展的工具,不需要通过setuptools的普通Extension流程处理——这种方式生成的.pyd文件并非Numba编译后的有效扩展,导入时Python会依然执行原.py脚本的逻辑,包括触发JIT编译(生成temp.c/temp.cxx)、执行if __name__=='__main__'代码块。
正确解决方案
方案1:直接用Numba pycc命令编译
不需要编写setup.py,直接在命令行执行:
python -m numba.pycc nfit1d.py --inplace
该命令会直接通过Numba的CC工具生成正确的.pyd扩展文件。
方案2:正确编写setup.py
如果一定要用setuptools管理编译,需利用CC实例的distutils_extension()方法生成对应的扩展配置,正确的setup.py代码如下:
from setuptools import setup # 导入你的pycc脚本中定义的CC实例 from nfit1d import cc setup( name='nufit1d', ext_modules=[cc.distutils_extension()] )
执行编译命令:
python setup.py build_ext --inplace
额外注意事项
编译完成后,确保生成的nufit1d.pyd文件与原nfit1d.py文件的导入优先级:
- 可以将原
nfit1d.py移走或重命名,避免Python导入时优先加载原脚本而非编译后的扩展。
内容的提问来源于stack exchange,提问作者Matt Reed
相关产品推荐
相关产品推荐

