desidero avvolgere una funzione C++ con SWIG che accetta un vettore di stringhe STL come parametro di input:SWIG incarto C++ per Python: tradurre un elenco di stringhe da uno STL vettore di stringhe 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;
}
voglio avvolgere questo in una funzione Python disponibile in un modulo chiamato `mymod ':
/*mymod.i*/
%module mymod
%include "typemaps.i"
%include "std_string.i"
%include "std_vector.i"
%{
#include "mymod.hpp"
%}
%include "mymod.hpp"
Quando costruisco questa estensione 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++']),
],
)
e quindi importarlo e provare a eseguirlo, ottengo questo errore:
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> >'
>>>
Sto indovinando questo sta dicendo che SWIG non fornisce un typemap di default per la traduzione tra una lista di stringhe Python Python e un vettore STL C++ di stringhe STL. Credo che questo sia qualcosa che potrebbero fornire da qualche parte per impostazione predefinita, ma forse non conosco il file giusto da includere. Quindi, come posso farlo funzionare?
Grazie in anticipo!
ho provato con/senza 'using namespace std;' e non faceva differenza. Sono d'accordo che le intestazioni dovrebbero essere scritte senza 'usare' dichiarazioni. La mia preoccupazione è che l'esempio che hai collegato sia per i vettori di primitivi, come gli interi e i doppi; Sono stato in grado di trovare nulla in linea per il vettore wrapping, o anche vettore . –
involucelate
La mia modifica indirizza gli altri tipi di vettore? Se non mi manca qualcosa di ovvio. – Demolishun