利用swig到处c++接口 给py

1:写c++测试代码

example.h 

#include <iostream>
using namespace std;
class example {
    private:
        int num;
    public:
        example();
        ~example();
        void say_hello(void);
        void change(int din);
        int get_num();
};

example.cpp

#include "example.h"
example::example()
{
        cout << "example::example()" << endl;
}
example::~example()
{
        cout << "example::~example()" << endl;
}
void example::say_hello(void) {
    cout << "hello python,I am C++" << endl;
}

void example::change(int din) {
    num = din;
}

int example::get_num(void) {
    return num;
}

2:编写example.i文件

%module example
%{
#include "example.h"
%}
%include "example.h"

3:执行swig指令

swig -c++ -python example.i

会得到  example.py   example_wrap.cxx这2个文件

4:编写setup.py 文件

#!/usr/bin/env python

"""
setup.py file for SWIG C\+\+/Python example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example.cpp', 'example_wrap.cxx',],
)
setup (name = 'example',
version = '0.1',
author = "www",
description = """Simple swig C\+\+/Python example""",
ext_modules = [example_module],
py_modules = ["example"],
)

5:执行setup.py 脚本

python setup.py build_ext --inplace

已经生成了_example.so

6:编写测试脚本 test.py

import example
a = example.example()
a.say_hello()
a.change(3)
print(a.get_num())

 

已经执行成功了并得到正确的结果

 由于setup.py 我们是用的python去执行的,不是python3 or pypy去执行的,所以。。。。

 python python3  pypy  pypy3 分别执行setup.py 之后 会有对应的so

此时再分别执行  python test.py   python3 test.py  pypy  test.py pypy3 test.py 就能成功执行并得到想要的结果

pypy 和 pypy3执行 为什么没有调用到析构函数???

 在test.py 结尾调用 del a   依然显示 没有调用 析构函数,具体原因未知,如有大佬知道麻烦告知一下。。。。。

so文件改名字问题

 python3 环境下 可以把_example.cpython-36m-x86_64-linux-gnu.so 改成_example.so,importlib同样能找到。。。如果这2个文件同时存在,importlib.import_module("_example") 导入的是带编号的 so,通过上图可以发现

 pypy3 环境下

 改名之后 发现是行不通的 这应该是由于 pypy3和python3中 importlib 这个库 有区别。。。python3优先找带版本号的 找不到就按照名字找  而pypy3 只找带版本号的找不到就报错!!!

对于c++中一些数据结构导入到python  参考

用SWIG向Python提供C++里STL的容器 · 零壹軒·笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值