funcion español c++ python string vector swig

español - funcion count en c++



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

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

#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 incluir 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 e intentar ejecutarlo, obtengo 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 está diciendo que SWIG no proporciona un mapa de tipos predeterminado para traducir entre una lista Python de cadenas de 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 por adelantado!


SWIG admite la transferencia de 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 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.


Debes decirle a SWIG que quieres un mapa de tipos de cadenas de vectores. No adivina mágicamente todos los tipos de vectores diferentes que pueden existir.

Esto es 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<int>; %template(DoubleVector) vector<double>; %template(StringVector) vector<string>; %template(ConstCharVector) vector<const char*>; } // Include the header file with above prototypes %include "example.h"