将 stdint 与 swig 和 numpy.i 一起使用

Posted

技术标签:

【中文标题】将 stdint 与 swig 和 numpy.i 一起使用【英文标题】:using stdint with swig and numpy.i 【发布时间】:2015-12-16 15:23:19 【问题描述】:

我正在开发一个基于swig 在Python 代码中使用c inline 的模块。 为此,我想让numpy 数组可以在C 中访问。到目前为止,我使用像 unsigned short 这样的 C 类型,但我想使用像 stdint.h 中的 uint16_t 这样的类型来保存我的模块遇到的任何编译器。

不幸的是,c++-函数在使用 stdint.htypes 时没有正确包装。给出的错误是:_setc() takes exactly 2 arguments (1 given)。这意味着,该函数未包装以接受 numpy 数组。当我使用例如错误不会发生unsigned short.

您有什么想法,我如何将 swig 映射 numpy 数组转换为 stdint-types

interface.i 不工作:

/* interface.i */
extern int __g();
%
%include "stdint.i"
%include "numpy.i"

%init %
import_array();
%
%apply (uint16_t* INPLACE_ARRAY3, int DIM1) (uint16_t* seq, int n1);
extern int __g();

c++ 功能不工作:

#include "Python.h"
#include <stdio.h>
#include <stdint.h>
extern uint16_t* c;
extern int Dc;
extern int Nc[4];
void _setc(uint16_t *seq, int n1, int n2, int n3)

    c = seq;
    Nc[0] = n1;
    Nc[1] = n2;
    Nc[2] = n3;

interface.i工作:

/* interface.i */
extern int __g();
%
%include "stdint.i"
%include "numpy.i"

%init %
import_array();
%
%apply (unsigned short* INPLACE_ARRAY3, int DIM1) (unsigned short* seq, int n1);
extern int __g();

c++ 函数工作:

#include "Python.h"
#include <stdio.h>
#include <stdint.h>
extern unsigned short* c;
extern int Dc;
extern int Nc[4];
void _setc(unsigned short *seq, int n1, int n2, int n3)

    c = seq;
    Nc[0] = n1;
    Nc[1] = n2;
    Nc[2] = n3;

【问题讨论】:

【参考方案1】:

哈哈,在我放弃并发布这个问题后几分钟,我找到了一些“解决方案”。

我编辑了numpy.i以适应我的事业: 我在第 3044 行 ff 中用 stdint.h 类型替换了旧的 C 类型:

[..]
/* Concrete instances of the %numpy_typemaps() macro: Each invocation
 * below applies all of the typemaps above to the specified data type.
 */
%numpy_typemaps(int8_t       , NPY_BYTE     , int)
%numpy_typemaps(uint8_t     , NPY_UBYTE    , int)
%numpy_typemaps(int16_t             , NPY_SHORT    , int)
%numpy_typemaps(uint16_t    , NPY_USHORT   , int)
%numpy_typemaps(int32_t               , NPY_INT      , int)
%numpy_typemaps(uint32_t      , NPY_UINT     , int)
%numpy_typemaps(long              , NPY_LONG     , int)
%numpy_typemaps(unsigned long     , NPY_ULONG    , int)
%numpy_typemaps(int64_t         , NPY_LONGLONG , int)
%numpy_typemaps(uint64_t, NPY_ULONGLONG, int)
%numpy_typemaps(float             , NPY_FLOAT    , int)
%numpy_typemaps(double            , NPY_DOUBLE   , int)
[..]

我想知道是否有人比编辑numpy.i 有更好的主意

干杯 乔辰

【讨论】:

哇+1。我认为正确的解决方案是提交错误报告,但我不知道它是否会落在灵巧的耳朵里。我实际上最终使用了 ``` %apply (unsigned char *IN_ARRAY1, int DIM1) (uint8_t * buff_ptr, int buff_size) ```

以上是关于将 stdint 与 swig 和 numpy.i 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 的几个 numpy 数组

SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

如何将复数从 python numpy 传递给 c(目前正在尝试使用 SWIG)

numpy.i 丢失。推荐的安装方式是啥?

带有 SWIG 未知长度数组的 NumPy C 扩展

numpy.i 是不是向 C++ 发送实际指针,或复制内存?