使用 SWIG 从 Python 向 C 传递和数组参数

Posted

技术标签:

【中文标题】使用 SWIG 从 Python 向 C 传递和数组参数【英文标题】:Passing and array argument to C from Python using SWIG 【发布时间】:2015-04-08 22:52:21 【问题描述】:

我是第一次使用 SWIG + Python + C,但在将数组从 Python 传递到 C 时遇到问题。

这是 C 中的函数签名。

my_setup(char * my_string, int my_count, int my_types[], double my_rate, int my_mode);

我想从 Python 中调用这个 C 函数,如下所示

my_array = [1, 2, 3, 4, 5, 6]
my_setup("My string", 6, my_array, 50, 0)

但我不知道如何构造数组my_array。我得到的错误是

Traceback (most recent call last):
  File "test_script.py", line 9, in <module>
    r = my_library.my_setup("My string", 6, my_types, 50, 0)
TypeError: in method 'my_setup', argument 3 of type 'int []'

我尝试使用SWIG interface file for numpy 和ctypes 失败。

我希望有人能帮我传递一个数组作为函数my_setup 的第三个参数。

另外,这是我的第一个堆栈溢出帖子!

【问题讨论】:

【参考方案1】:

解析 my_setup() 中的 Python 列表,而不是尝试在 SWIG .i 文件中翻译它。改变

my_setup(char * my_string, int my_count, int my_types[], double my_rate, int my_mode);

my_setup(char * my_string, int my_count, PyObject *int_list, double my_rate, int my_mode);

在 my_setup 中

    int *array = NULL;
    if ( PyList_Check( int_list ) )
    
        int nInts = PyList_Size( int_list );
        array = malloc( nInts * sizeof( *array ) );
        for ( int ii = 0; ii < nInts; ii++ )
        
            PyObject *oo = PyList_GetItem( int_list, ii );
            if ( PyInt_Check( oo ) )
            
                array[ ii ] = ( int ) PyInt_AsLong( oo );
            
        
    

您必须添加错误检查。从 C 语言中,当您使用 SWIG 时,始终将 PyObject * 返回给 Python。这样,你可以使用PyErr_SetString() 并返回NULL 来抛出异常。

【讨论】:

以上是关于使用 SWIG 从 Python 向 C 传递和数组参数的主要内容,如果未能解决你的问题,请参考以下文章

无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数

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

SWIG+c+Python:传递和接收 c 数组

SWIG:将 Python 字符串传递给 void 指针类型的参数

如何在 SWIG/Python 中将结构列表传递给 C

swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals