2011-12-12 39 views
9

Tôi muốn quấn một ++ chức năng C với SWIG mà chấp nhận một vector của chuỗi STL như một tham số đầu vào:SWIG gói C++ cho Python: dịch một danh sách các chuỗi để một vector STL của chuỗi 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; 
} 

tôi muốn quấn này vào một hàm Python có sẵn trong một module gọi là 'mymod':

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

%{ 
#include "mymod.hpp" 
%} 

%include "mymod.hpp" 

Khi tôi xây dựng mở rộng này với

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

và sau đó nhập nó và cố gắng chạy nó, tôi nhận được lỗi này:

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

Tôi đoán này được nói rằng SWIG không cung cấp một typemap mặc định cho dịch giữa một danh sách Python của chuỗi Python và một vector C++ STL của chuỗi STL. Tôi cảm thấy như thế này là một cái gì đó họ có thể cung cấp một nơi nào đó theo mặc định, nhưng có lẽ tôi không biết đúng tập tin để bao gồm. Vậy làm cách nào tôi có thể làm việc này?

Cảm ơn trước!

Trả lời

2

SWIG hỗ trợ truyền danh sách tới hàm lấy một vectơ làm giá trị hoặc tham chiếu vectơ const. Ví dụ tại http://www.swig.org/Doc2.0/Library.html#Library_std_vector cho thấy điều này, tôi không thể thấy bất cứ điều gì sai trái với những gì bạn đã đăng. Cái gì khác là sai; DLL được tìm thấy bởi python không phải là mới nhất, việc sử dụng namespace std trong header gây nhầm lẫn cho mã wrapper SWIG thực hiện kiểm tra kiểu (lưu ý rằng "using namespace" statement trong .hpp là một không-không nói chung vì nó kéo mọi thứ từ std vào không gian tên chung), v.v.

+0

Tôi đã thử nó có/không có 'using namespace std; 'và nó làm cho không có sự khác biệt. Tôi đồng ý rằng các tiêu đề nên được viết mà không có câu lệnh 'using'. Mối quan tâm của tôi là ví dụ bạn đã liên kết ở đó là cho các vectơ nguyên thủy, như ints và double; Tôi đã có thể tìm thấy không có gì trực tuyến cho gói vector , hoặc thậm chí vector . – involucelate

+0

Tôi có chỉnh sửa địa chỉ các loại véc tơ khác không? Nếu không, tôi thiếu một cái gì đó hiển nhiên. – Demolishun

17

Bạn cần nói với SWIG rằng bạn muốn có một typemap chuỗi vectơ. Nó không kỳ diệu đoán tất cả các loại vector khác nhau có thể tồn tại.

Đây là tại liên kết được cung cấp bởi 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" 
Các vấn đề liên quan