怀疑如何使用SWIG

时间:2016-12-25 19:43:11

标签: python c swig python-c-api

上下文

我在c中实现了一个我想在python环境中测试的函数。经过一些阅读,我决定使用SWIG工具。刚刚做了一个简单的例子here,但我仍然怀疑,所以我决定来这里。 c项目包含以下文件

  • ransac2Dline.h
  • ransac2Dline.c
  • svd.h
  • svd.c

我想要使用的功能是

int ransac_2Dline(float **data, int n, int maxT, float threshold,
                    float *bestModel, int *bestInliers, int verbose);

在头文件ransac2Dline.h中用其他辅助函数声明。标题内容是

#ifndef RANSAC2DLINE_H
#define RANSAC2DLINE_H

#include <time.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "svd.hpp"

int ransac_2Dline(float **data, int n, int maxT, float threshold,
                    float *bestModel, int *bestInliers, int verbose);

int randomSelect(float **sel, int nsel, float **data, int *ndata);

int fitModel_line(float *point, float *l, float threshold);

void estimateModel_line(float *l, float **P, int n);

void twoPointsLine(float *l, float **P);

#endif /* RANSAC2DLINE_H */

问题

i)我想知道我应该如何定义SWIG模块.i。由于我想要一个仅用于 ransac_2Dline 功能的接口,我想SWIG模块需要处理它。我的意思是像这样的东西

/* File: ransac.i */
%module ransac

%{
#define SWIG_FILE_WITH_INIT
#include "ransac2Dline.h"
%}

int ransac_2Dline(float **data, int n, int maxT, float threshold,
                      float *bestModel, int *bestInliers, int verbose);

。这是正确的吗?或者我应该做些不同的事情?

ii) ransac_2Dline 函数计算的导入数据最多,它不会被返回(返回的int值只是函数成功完成的一个指标)任务)但它在外部范围内由点 * bestModel 转为可用。可以通过SWIG创建接口来在python环境中模拟这种方法吗?

iii)这种方法是一个很好的解决方案,还是应该使用ctypes或其他任何方法?

更多信息

我正在使用Ubuntu 14.04.5 LTS,使用g ++编译器和python vesion 2.7.6。

我将非常感谢任何帮助或提示(这个主题对我来说有点困难,因为我是一名机械工程师,对机器人工作有愚蠢的想法。:))。

1 个答案:

答案 0 :(得分:0)

使用gcc(而不是g++)。 也可以使用swig -python ransac_2Dline.i(但不使用-c++选项)