使用SWIG指针参数封装C功能(Wrapping C function with pointer a

2019-10-18 15:01发布

我试图用SWIG来包装现有的C库在Python中使用。 我在Windows XP上运行痛饮2.0.10与Python 2.7.4。 我遇到的问题是,我无法调用具有一个指向一个int作为其是其中函数的结果是要被存储的参数包裹C函数。 我蒸的问题转化为如下示例代码:

C函数在convert.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的痛饮接口文件

/* File : convert.i */
%module convert
%{
#include "convert.h"
%}

%include "convert.h"

所有这一切都被内置到使用Visual C ++ 2010年当构建完成后,我留下了两个文件,一个文件.pyd:convert.py和_convert.pyd build目录。 我在此目录中打开命令窗口,并开始蟒蛇会话并输入以下命令:

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 *'

为什么我的指针对象被拒绝? 我应该怎么做才能使这项工作?

Answer 1:

SWIGctypes是不同的库,这样你就可以不通过ctypes的物品直接痛饮包装的功能。

在SWIG中, %apply命令可应用于typemaps共同参数类型它们配置为INPUTINOUT ,或OUTPUT参数。 尝试以下方法:

%module convert
%{
#include "convert.h"
%}

%apply int *OUTPUT {int*};
%include "convert.h"

Python将不再需要对输入的参数,并且将改变函数的输出为返回值和任何的元组INOUTOUTPUT参数:

>>> import convert
>>> convert.convert('123')
[0, 123]

需要注意的是超越POD(普通旧数据)的参数类型,通常需要编写自己的typemaps。 咨询SWIG文档了解更多详情。



文章来源: Wrapping C function with pointer arguments using SWIG
标签: python swig