我正在尝试使用SWIG来包装现有的C库,以便在Python中使用。我正在使用Python 2.7.4在Windows XP上运行swig 2.0.10。我遇到的问题是我无法调用一个包含C函数,该函数具有指向int的指针作为参数,该参数是存储函数结果的地方。我已将问题提炼为以下示例代码:
convert.c中的C函数:
#include <stdio.h>
#include "convert.h"
#include <stdlib.h>
int convert(char *s, int *i)
{
*i = atoi(s);
return 0;
}
convert.h中的头文件
#ifndef _convert_h_
#define _convert_h_
int convert(char *, int *);
#endif
convert.i中的swig接口文件
/* File : convert.i */
%module convert
%{
#include "convert.h"
%}
%include "convert.h"
所有这些都是使用Visual C ++ 2010构建到.pyd文件中。当构建完成后,我留下了两个文件:build目录中的convert.py和_convert.pyd。我在这个目录中打开一个命令窗口并启动python会话并输入以下内容:
Python 2.7.4 (default, Apr 6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> import convert
>>> dir(convert)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '_convert', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic', 'convert']
>>> i = c_int()
>>> i
c_long(0)
>>> convert.convert('1234', byref(i))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'convert', argument 2 of type 'int *'
为什么我的指针对象被拒绝了?我应该怎么做才能使这项工作?
答案 0 :(得分:2)
SWIG
和ctypes
是不同的库,因此您无法将ctypes对象直接传递给SWIG包装的函数。
在SWIG中,%apply
命令可以将类型映射应用于常见参数类型,以将其配置为INPUT
,INOUT
或OUTPUT
参数。请尝试以下方法:
%module convert
%{
#include "convert.h"
%}
%apply int *OUTPUT {int*};
%include "convert.h"
Python将不再需要输入参数,并将函数的输出更改为返回值的元组以及任何INOUT
或OUTPUT
参数:
>>> import convert
>>> convert.convert('123')
[0, 123]
请注意,POD(普通旧数据)类型之外的参数通常需要编写自己的类型地图。有关详细信息,请参阅SWIG Documentation。