2011-12-12 13 views
9

Me gustaría envolver una función de C++ con el TRAGO que acepta un vector de cadenas STL como un argumento de entrada:TRAGO envoltura C++ para Python: la traducción de una lista de cadenas a un vector de STL de cadenas 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; 
} 

Quiero terminar con esto en una función de Python disponible en un módulo llamado `mimodelo ':

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

%{ 
#include "mymod.hpp" 
%} 

%include "mymod.hpp" 

Cuando construyo esta extensión con

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++']), 
         ], 
) 

y luego importarlo y tratar de ejecutarlo, me sale este error:

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

supongo que esto dice que el TRAGO no proporciona una typemap predeterminado para la traducción entre una lista de cadenas de Python Python y un vector C++ STL de cadenas STL. Siento que esto es algo que podrían proporcionar en algún lugar de manera predeterminada, pero quizás no sé cuál es el archivo correcto para incluir. Entonces, ¿cómo puedo hacer que esto funcione?

¡Gracias de antemano!

Respuesta

2

SWIG admite la transferencia de una lista a una función que toma un vector como valor o una referencia vectorial const. El ejemplo en http://www.swig.org/Doc2.0/Library.html#Library_std_vector muestra esto, no veo nada malo con lo que publicaste. Algo más está mal; La DLL encontrada por python no era la última, el uso de espacio de nombres std en el encabezado confunde el código SWIG wrapper que hace la comprobación de tipo (tenga en cuenta que las declaraciones "using namespace" en .hpp son un no-no en general ya que lo arrastra todo de std en el espacio de nombre global), etc.

+0

he probado con/sin 'using namespace std;' y no había ninguna diferencia. Estoy de acuerdo en que los encabezados deben escribirse sin declaraciones 'using'. Mi preocupación es que el ejemplo que ha vinculado allí es para vectores de primitivos, como ints y dobles; No he podido encontrar nada en línea para envolver el vector , o incluso el vector . – involucelate

+0

¿Mi edición aborda los otros tipos de vectores? Si no, me falta algo obvio. – Demolishun

17

Debe decirle a SWIG que desea un vector de tipo de cadena de caracteres. No adivina mágicamente todos los tipos de vectores diferentes que pueden existir.

Este es el enlace proporcionado por 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"