Python 2.7 scipy.integrate.quad ctypes函数错误“;quadpack.error:quad:第一个参数是签名不正确的ctypes函数指针;

Python 2.7 scipy.integrate.quad ctypes函数错误“;quadpack.error:quad:第一个参数是签名不正确的ctypes函数指针;,python-2.7,scipy,ctypes,integrate,Python 2.7,Scipy,Ctypes,Integrate,我正在尝试使用带有ctypes函数的scipy.integrate.nqad。我完全按照指示去做 ctypes集成只需几个简单步骤: 使用函数签名double f(int n,double args[n])在C中编写一个被积函数,其中args是包含函数f参数的数组 现在将该文件编译到一个共享/动态库中(快速搜索会有所帮助,因为它依赖于操作系统)。用户必须链接所使用的任何数学库等。在Linux上,这看起来像: 输出库将被称为testlib.so,但它可能具有不同的文件扩展名。现在已经创建了一个

我正在尝试使用带有
ctypes
函数的
scipy.integrate.nqad
。我完全按照指示去做

ctypes
集成只需几个简单步骤:

  • 使用函数签名
    double f(int n,double args[n])
    在C中编写一个被积函数,其中
    args
    是包含函数
    f
    参数的数组
  • 现在将该文件编译到一个共享/动态库中(快速搜索会有所帮助,因为它依赖于操作系统)。用户必须链接所使用的任何数学库等。在Linux上,这看起来像:
  • 输出库将被称为
    testlib.so
    ,但它可能具有不同的文件扩展名。现在已经创建了一个库,可以通过
    ctypes
    加载到Python中

  • 使用
    ctypes
    将共享库加载到Python中,并设置
    restypes
    argtypes
    ——这允许Scipy解释函数 正确地说:
  • 请注意,无论参数的数量如何,argtypes始终为
    (ctypes.c_int,ctypes.c_double)
    ,而restype始终为
    ctypes.c_double

  • 现在,使用
    nqad
    ,像往常一样集成库函数:
  • 然而,在最后一步,我没有得到积分的结果,而是得到了以下错误:

    >>> integrate.nquad(func,[[0,1.0],[-2.0,3.0],[1.0,2.0]])
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 618, in nquad
          return _NQuad(func, ranges, opts).integrate(*args)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
    quadpack.error: quad: first argument is a ctypes function pointer with incorrect signature
    
    integrate.nqad(func,[[0,1.0]、-2.0,3.0]、[1.0,2.0]) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第618行,在nqad中 return\u nqad(函数、范围、选项).integrate(*args) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第670行,在integrate中 值,abserr=quad(f,低,高,args=args,**opt) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第254行,四行 retval=_四元(func,a,b,args,full_输出,epsabs,epsrel,limit,points) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第319行,四行 返回_quadpack._qagse(func、a、b、args、full输出、epsabs、epsrel、limit) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第670行,在integrate中 值,abserr=quad(f,低,高,args=args,**opt) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第254行,四行 retval=_四元(func,a,b,args,full_输出,epsabs,epsrel,limit,points) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第319行,四行 返回_quadpack._qagse(func、a、b、args、full输出、epsabs、epsrel、limit) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第670行,在integrate中 值,abserr=quad(f,低,高,args=args,**opt) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第254行,四行 retval=_四元(func,a,b,args,full_输出,epsabs,epsrel,limit,points) 文件“/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py”,第319行,四行 返回_quadpack._qagse(func、a、b、args、full输出、epsabs、epsrel、limit) quadpack.error:quad:第一个参数是签名不正确的ctypes函数指针
    我使用的是gcc-4.4.7、python2.6.6、numpy-1.7.1、scipy-0.13.3,参数的类型应该是:
    ctypes.POINTER(ctypes.c\u double)


    但是您是否考虑过使用
    cffi
    ?除了比
    ctypes
    更快之外,您还不必手工编写参数,只需复制C声明并让
    cffi
    解析它们。

    参数的类型应该是:
    ctypes.POINTER(ctypes.C\u double)


    但是您是否考虑过使用
    cffi
    ?除了比
    ctypes
    更快之外,您还不必手工编写参数,只需复制C声明并让
    cffi
    解析它们。

    函数签名中的
    double args[n]
    与您遵循的
    double*args
    相同。这似乎是一个新的功能,不存在于或。我使用的是scipy-0.15.1
    integrate.nqad(func,[[0,1.0],-2.0,3.0],[1.0,2.0]])
    生成
    (-1.25,1.4017986003800292e-13)
    其中
    func
    是您问题中的
    ctypes
    函数。@nymk您说得对。我尝试了0.15.1,它可以工作。
    函数签名中的双参数[n]
    与您遵循的
    double*args
    相同。这似乎是一个新的功能,不存在于或。我使用的是scipy-0.15.1
    integrate.nqad(func,[[0,1.0],-2.0,3.0],[1.0,2.0]])
    生成
    (-1.25,1.4017986003800292e-13)
    其中
    func
    是您问题中的
    ctypes
    函数。@nymk您说得对。我尝试了0.15.1,它可以工作。
    scipy.integrate.quad
    不理解
    cffi
    ,只理解
    ctypes
    函数。
    scipy.integrate.quad
    不理解
    cffi
    ,只理解
    ctypes
    函数。
    $ gcc -shared -o testlib.so -fPIC testlib.c
    
    >>> import ctypes
    
    >>> from scipy import integrate
    
    >>> lib = ctypes.CDLL('/**/testlib.so') # Use absolute path to testlib
    
    >>> func = lib.f # Assign specific function to name func (for simplicity)
    
    >>> func.restype = ctypes.c_double
    
    >>> func.argtypes = (ctypes.c_int, ctypes.c_double)
    
    >>> integrate.nquad(func, [[0,10],[-10,0],[-1,1]])
    
    (1000.0, 1.1102230246251565e-11)
    
    >>> integrate.nquad(func,[[0,1.0],[-2.0,3.0],[1.0,2.0]])
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 618, in nquad
          return _NQuad(func, ranges, opts).integrate(*args)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 670, in integrate
    
        value, abserr = quad(f, low, high, args=args, **opt)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 254, in quad
    
        retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
    
      File "/home/bfn097/apps/scipy/0.13.3_mkl-11.1.2_gcc-4.4.7/lib64/python/scipy/integrate/quadpack.py", line 319, in _quad
    
        return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    
    quadpack.error: quad: first argument is a ctypes function pointer with incorrect signature