SWIG envolviendo C ++ para Python: traduciendo una lista de cadenas a un vector STL de cadenas STL

Me gustaría envolver una función C ++ con SWIG que acepte un vector de cadenas STL como un argumento de entrada:

#include  #include  #include  using namespace std; void print_function(vector strs) { for (unsigned int i=0; i < strs.size(); i++) cout << strs[i] << endl; } 

Quiero envolver esto en una función de Python disponible en un módulo llamado `mymod ‘:

 /*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 "", line 1, in  TypeError: in method 'print_function', argument 1 of type 'std::vector< std::string,std::allocator >' >>> 

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

¡Gracias por adelantado!

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

Esto está en 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; %template(DoubleVector) vector; %template(StringVector) vector; %template(ConstCharVector) vector; } // Include the header file with above prototypes %include "example.h" 

SWIG no admite pasar una lista a una función que toma un vector como valor o una referencia de vector constante. El ejemplo en http://www.swig.org/Doc2.0/Library.html#Library_std_vector muestra esto, no puedo ver nada malo con lo que publicaste. Algo más está mal; El archivo DLL encontrado por python no era el más reciente, el uso de espacio de nombres estándar en el encabezado confunde el código de envoltorio SWIG que realiza la comprobación de tipos (tenga en cuenta que las declaraciones de “uso de espacio de nombres” en .hpp son un no-no en general, ya que extrae todo de estándar en espacio de nombres global), etc.