2011-12-12 14 views
9

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!

risposta

2

SWIG supporta il passaggio di una lista a una funzione che accetta un vettore come valore o un riferimento vettoriale const. L'esempio a http://www.swig.org/Doc2.0/Library.html#Library_std_vector mostra questo, non riesco a vedere nulla di sbagliato in ciò che hai postato. Qualcos'altro è sbagliato; La DLL trovata da python non era l'ultima, l'uso dello spazio dei nomi std nell'intestazione confonde il codice del wrapper SWIG che esegue il controllo del tipo (si noti che le istruzioni "using namespace" in .hpp sono un no-no in generale, dato che tira tutto da std in namespace globale), ecc.

+0

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

+0

La mia modifica indirizza gli altri tipi di vettore? Se non mi manca qualcosa di ovvio. – Demolishun

17

È necessario comunicare a SWIG che si desidera una tipografia di stringa vettoriale. Non immagina magicamente tutti i diversi tipi di vettore che possono esistere.

questo è al link fornito da 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" 
Problemi correlati