Сомнения в том, как сделать c-оболочку для python с помощью SWIG

Контекст

У меня есть функция, реализованная в c, которую я хотел бы протестировать в среде python. После некоторых прочтений я решил использовать инструмент SWIG. Я только что сделал простой пример, представленный здесь, но я все еще теряюсь в сомнениях и вот я решил приехать сюда. Проект c имеет следующие файлы

  • ransac2Dline.h
  • ransac2Dline.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 2.7.6.

Я буду очень признателен за любую помощь или совет (эта тема немного сложна для меня, так как я инженер-механик, у которого была глупая идея работать с роботами. :)).


person Randerson    schedule 25.12.2016    source источник


Ответы (1)


Используйте gcc (а не g++). Также используйте swig -python ransac_2Dline.i (но без опции -c++)

person John Greene    schedule 06.01.2017