2011-12-12 50 views
9

我想換用SWIG C++函數,它接受STL串的矢量作爲輸入參數:SWIG包裹C++爲Python:翻譯字符串的列表,以STL字符串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; 
} 

我想包裝成所謂的'mymod「一個Python可用模塊功能如下:

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

%{ 
#include "mymod.hpp" 
%} 

%include "mymod.hpp" 

當我建立這個擴展與

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

,然後導入並嘗試運行它,我得到這個錯誤:

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

我猜這是說,呷不爲Python字符串的Python列表和之間的轉換提供了一個默認類型映射一個STL字符串的C++ STL向量。我覺得這是他們默認提供的地方,但也許我不知道要包含哪個文件。那麼我怎麼才能使這個工作?

在此先感謝!

回答

2

SWIG支持將列表傳遞給以vector爲值或const vector引用的函數。在http://www.swig.org/Doc2.0/Library.html#Library_std_vector的例子顯示了這一點,我看不出你發佈的內容有什麼問題。還有其他的錯誤;由python發現的DLL不是最新的,標頭中使用的命名空間std會混淆執行類型檢查的SWIG包裝器代碼(請注意,.hpp中的「使用命名空間」語句在一般情況下是不允許的,因爲它會將所有內容從std到全局命名空間)等等。

+0

我/嘗試過不'使用命名空間std;',它並沒有區別。我同意頭文件不應該使用''語句來編寫。我擔心的是,你所鏈接的例子是基元的矢量,如整數和雙精度;我在網上找不到包裝矢量,甚至矢量。 – involucelate

+0

我的編輯是否處理其他矢量類型?如果不是,我錯過了一些明顯的東西 – Demolishun

17

你需要告訴SWIG你想要一個向量字符串typemap。它不會奇蹟般地猜測可能存在的所有不同的矢量類型。

這是在由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"