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 参考