You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Numba pycc编译函数后,ctypes导入出现未定义符号错误

Numba AOT编译问题:找不到cumulativeMin符号及pycc弃用解决

问题背景

尝试用Numba做提前编译(AOT),使用numba.pycc.CC编译cumulativeMin函数后,用ctypes加载生成的.so文件时触发AttributeError,提示未定义符号cumulativeMin,同时收到pycc模块即将弃用的警告。

原因分析

  1. pycc编译产物是Python扩展模块,不是普通C共享库:numba.pycc.CC生成的是Python扩展,函数仅作为Python模块的成员导出,不会暴露为C语言级别的符号,因此ctypes无法直接找到cumulativeMin。
  2. pycc已被弃用:Numba官方已标记numba.pycc为弃用,推荐使用新的编译接口。

解决方案

方案1:直接导入编译后的Python扩展模块(最简单,适合Python内调用)

编译后的.so是标准Python扩展,无需用ctypes加载,直接import调用:

import numpy as np
import base_model  # 导入编译生成的模块

array = np.random.uniform(-1, 0, 1000)
result = base_model.cumulativeMin(array)
print(result)

方案2:使用Numba新CC模块替代pycc(解决弃用警告)

替换numba.pycc.CC为numba.cc.CC,编译逻辑基本一致,同时消除弃用警告:

import numpy as np
import numba
from numba import cc  # 替代numba.pycc

cc = cc.CC('base_model')
cc.verbose = True

@cc.export('cumulativeMin', 'float64[:](float64[:])')  
def cumulativeMin(A):
    r = np.empty(len(A))
    t = np.inf
    for i in range(len(A)):
        t = np.minimum(t, A[i])
        r[i] = t
    return r

if __name__ == "__main__":
    cc.compile()

编译后同样直接import base_model调用即可。

方案3:生成可被ctypes调用的C共享库(跨语言调用场景)

若需生成能被C/ctypes直接调用的共享库,使用numba.cfunc接口:

步骤1:编译生成C共享库

import numpy as np
from numba import cfunc, types

# 定义函数签名
sig = types.float64[:](types.float64[:])

@cfunc(sig, nopython=True)
def cumulativeMin(A):
    r = np.empty(len(A))
    t = np.inf
    for i in range(len(A)):
        t = np.minimum(t, A[i])
        r[i] = t
    return r

# 导出为共享库
cumulativeMin.export_library('cumulative_min.so')

步骤2:用ctypes正确调用

import numpy as np
import ctypes
from numba import ctypes_support

# 加载共享库
lib = ctypes.cdll.LoadLibrary('./cumulative_min.so')

# 获取ctypes兼容的函数对象
cumulative_min_func = cumulativeMin.ctypes

# 准备输入数组(需为float64类型)
array = np.random.uniform(-1, 0, 1000).astype(np.float64)

# 调用函数并获取结果
result = cumulative_min_func(array)
print(result)

内容的提问来源于stack exchange,提问作者user189035

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:15:37