SWIG-оболочка C ++ для Python: перевод списка строк в вектор STL из строк STL - PullRequest
9 голосов
/ 12 декабря 2011

Я хотел бы обернуть функцию C ++ SWIG, которая принимает вектор строк STL в качестве входного аргумента:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void print_function(vector<string> strs) {
  for (unsigned int i=0; i < strs.size(); i++)
  cout << strs[i] << endl;
}

Я хочу обернуть это в функцию Python, доступную в модуле под названием `mymod ':

/*mymod.i*/
%module mymod
%include "typemaps.i"
%include "std_string.i"
%include "std_vector.i"

%{
 #include "mymod.hpp"
%}

%include "mymod.hpp"

Когда я строю это расширение с

from distutils.core import setup, Extension

setup(name='mymod',
  version='0.1.0',
  description='test module',
  author='Craig',
  author_email='balh.org',
  packages=['mymod'],
  ext_modules=[Extension('mymod._mymod',
                         ['mymod/mymod.i'],
                         language='c++',
                         swig_opts=['-c++']),
                         ],
  )

, а затем импортировать его и попытаться запустить, я получаю эту ошибку:

Python 2.7.2 (default, Sep 19 2011, 11:18:13) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mymod
>>> mymod.print_function("hello is seymour butts available".split())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'print_function', argument 1 of type 'std::vector<  std::string,std::allocator< std::string > >'
>>> 

Я предполагаю, что это говорит о том, что SWIG не предоставляет карту типов по умолчанию для перевода между списком Python строк Python и вектором STL строк C ++ STL. Я чувствую, что это то, что они могут предоставить где-то по умолчанию, но, возможно, я не знаю, какой файл включить. Так как мне заставить это работать?

Заранее спасибо!

Ответы [ 2 ]

17 голосов
/ 06 января 2012

Вам нужно сообщить SWIG, что вы хотите векторную строковую карту.Он волшебным образом не угадывает все различные типы векторов, которые могут существовать.

Это по ссылке, предоставленной Schollii:

//To wrap with SWIG, you might write the following:

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

%include "std_vector.i"
%include "std_string.i"

// Instantiate templates used by example
namespace std {
   %template(IntVector) vector<int>;
   %template(DoubleVector) vector<double>;
   %template(StringVector) vector<string>;
   %template(ConstCharVector) vector<const char*>;
}

// Include the header file with above prototypes
%include "example.h"
2 голосов
/ 12 декабря 2011

SWIG поддерживает передачу списка в функцию, которая принимает вектор в качестве значения или константную ссылку на вектор.Пример на http://www.swig.org/Doc2.0/Library.html#Library_std_vector показывает это, я не вижу ничего плохого в том, что вы опубликовали.Что-то еще не так;DLL, найденная python, была не последней, использование пространства имен std в заголовке вводит в заблуждение код оболочки SWIG, который выполняет проверку типов (обратите внимание, что операторы «using namespace» в .hpp в общем-то запрещают, поскольку тянут всеиз стандартного стандартного пространства в глобальное пространство имен) и т. д.

...