您的位置:首页 > 编程语言 > C语言/C++

利用swig,在python中使用C++的类

2015-11-10 10:47 483 查看
1. 下载swig。http://www.swig.org/download.html我是在windows上开发,所以下载的是windows prebuilt版本。


2. 要使用的就是那个swig.exe. 参照例子先写一个C++的类,a.h 和a.cpp。

#pragma once
#include <string>
#include <iostream>
#include <vector>

using namespace std;

class Revert
{
public:
Revert(string a1, string a2);
string Output();
private:
string m1;
string m2;
};


#include "a.h"

Revert::Revert(string a1, string a2) : m1(a1), m2(a2)
{
}

string Revert::Output()
{
cout << m2 << "  " << m1 << endl;
return m2 + m1;
}


胡乱写的,用std::string作为参数,结果这个在后面还真遇到了问题。

3 仿照例子写接口文件a.i。

%module myAAA
%include "std_string.i"
%{
#include "a.h"
%}
using namespace std;
%include "a.h"


这里一定要注意,用了stl的类作为参数,一定要include相应的.i。否则在python里输入参数时会出现类型错误,类似这种

TypeError: in method 'new_Revert', argument 1 of type 'string'

如果开放namespace, 一定记住要在.i文件里也using namespace. 

Swig有专门的文档讲这个:http://www.swig.org/Doc3.0/Library.html#Library_stl_cpp_library

基本涵盖了各种stl的常用类型。

4. 生成wrap源码。

swig.exe -c++ -python a.i

会生成a_wrap.cxx和一个.py文件, myAAA.py

5. 建立一个visual studio win32 dll的project,把a.h a.cpp a_wrap.cxx都加进去,编译。

注意要加上python的头文件和lib,我的是在C:\Python27\include和C:\Python27\libs, 库是python27.lib。如果是安装的python,应该就只有release版。同时请注意是x64的,还是x86的。

6. 一切顺利的话会生成一个dll。将其更名为_myAAA.pyd。注意一定是_myAAA,下划线很重要,因为swig生成的py文件中import _myAAA。否则import myAAA时会出错。

7. 将myAAA.py和_myAAA.pyd放到python可以找到的位置。启动python shell

8.  试试以下代码

import myAAA
c = myAAA.Revert("a", "b")
c.Output()


会输出
b a
'ba'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: