Swig:C/C++代码转Python
来源:互联网 发布:在知乎工作 编辑:程序博客网 时间:2024/06/10 07:46
下面用一个简单的小例子来说明,C++的源代码如下:(这里用到了C++11的特性)
//kmodel.hpp#ifndef KMODEL_H#define KMODEL_H#include <string>#include <iostream>#include <unordered_map>#include <stdint.h>class KModel{public: KModel(){ umap["123"]=1024; umap["name"]=2048; } std::unordered_map<std::string,int> umap; void say(std::string v);};#endif
//kmodel.cpp#include "kmodel.hpp"using namespace std;void KModel::say(string v){ cout<<umap[v]<<endl;}
Swig下载地址,目前使用的是Swig-3.0.12
1.编写转换规则kmodel.i
%module kmodel %include "std_string.i"%{ #include "kmodel.hpp"%}%include "kmodel.hpp"
%include “kmodel.hpp”,表示类或函数的声明,可以直接添加进来。另外需要添加%include “std_string.i”,是因为say方法的参数是string类型,所以要添加string的头文件,若不添加会出现下面的错误
TypeError: in method 'KModel_say', argument 2 of type 'std::string'
通常你的接口用了什么类型,最好都把其头文件添加上去,下面是C++类、C++库 以及SWIG接口文件的对应表
2.生成中间文件
swig -c++ -python kmodel.i
上面的代码会生成2个中间文件:
kmodel.py :在Python中import包时会用到
kmodel_wrap.cxx:编译C++时会用到
3.使用distutils工具编译
"""setup.py"""from distutils.core import setup, Extensionsetup(name = "kmodel", version = "1.0", ext_modules = [Extension("_kmodel", ["kmodel_wrap.cxx", "kmodel.cpp"],extra_compile_args = ['-std=c++11'])], py_modules=['kmodel'])
这个格式是固定的,注意命名和额外的编译参数,然后编译安装
python setup.py install
进入python命令行进行测试:
>>> from kmodel import *>>> k=KModel()>>> k.say("123")1024
注意的问题:
1)C++类中声明的方法必须有实现,只声明不实现会出现下面的错误
ImportError: /usr/local/anaconda3/lib/python3.6/site-packages/_kmodel.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN9ModelTool17getFormatFileSizeEm
2)GCC版本必须和Python的底层GCC版本保持一致,否则出现下面的错误
undefined symbol: _ZSt24__throw_out_of_range_fmtPKcz
解决的方法可以升级当前的Python的GCC版本,比如我使用的是anaconda3,升级GCC的命令如下:
conda install libgcc
参考:
http://www.cnblogs.com/kaituorensheng/p/4464117.html
http://blog.csdn.net/earbao/article/details/10473329
https://www.zhihu.com/question/56272908
阅读全文
0 0
- Swig:C/C++代码转Python
- Python 使用C代码——swig
- SWIG封装C代码
- swig c python
- Python与C++,SWIG
- 通过SWIG封装C/C++代码被Python调用
- TensorFlow中的SWIG实现Python调用C/C++代码
- 利用Swig在python中调用C/C++代码
- Python调用C/C++(使用SWIG)
- 在Python中调用C++,使用SWIG
- centos swig 编译c,python调用
- python通过swig调用c程序举例
- 采用SWIG实现python调用C函数
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- SWIG and Python(用SWIG将C/C++封装为Python扩展模块)
- 脚本c接口swig
- Swig编译C代码供java调用实例
- POI处理excel大数据
- C# 实现无标题栏窗口拖动效果
- struts文件上传和下载
- Java 错误解决之java.lang.IllegalArgumentException: Comparison method violates its general contract
- java修改项目web访问根目录
- Swig:C/C++代码转Python
- AngularJs中拟态框影响返回按钮返回问题
- Servlet 单例吗?action单例吗?
- poi实现Excel模板的报表导出
- Oracle11g中---SqlPlus可以正常登陆,sqlDeveloper无法登录
- 锁的种类与特点
- 支付功能集成包-简单设计
- hive 认证
- 剑指offer--二进制中的1的个数--补码