如何使用python调用so接口

如何生成so文件?

为了生成so文件,只需要修改makefile中的编译参数,主要是加上-shared等参数。我们下面会用一个实例来说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//test_ctypes.cpp
#include "test_ctypes.h"

A::A(int n) {
num = n;
}

A::~A() {
num = 0;
}

int A::get_num() {
return num;
}

//封装
extern "C" {
void* get_instance(int n) {
return new(std::nothrow)A(n);
}

int get_num(void* ptr) {
assert(NULL != ptr);
A* a = reinterpret_cast<A*>(ptr);
return a->get_num();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
//test_ctypes.h
#include <stdio.h>
#include <assert.h>
#include <new>

class A {
public:
A(int n);
virtual ~A();
int get_num();
private:
int num;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
//makefile
RM=rm -rf
CXX=g++

test_ctypes.so : test_ctypes.o
$(CXX) -fPIC -shared -o $@ $^

test_ctypes.o : test_ctypes.cpp test_ctypes.h
$(CXX) -fPIC -c -o $@ $<

clean:
$(RM) test_ctypes.o
$(RM) test_ctypes.so

如何使用ctypes生成python调用接口?

模块ctypes是Python内建的用于调用动态链接库函数的功能模块,但是,在调用C++代码的时候,需要对代码中的函数使用extern “C”进行封装。原因是,由于C++多了函数重载的功能,导致了一个函数不能仅仅用它的名字来确定,编译器会将名字优化成并不是程序中看到的名字。下面是如何在python中使用:

1
2
3
4
5
6
7
#-*- coding:utf-8 -*-

import ctypes
so = ctypes.cdll.LoadLibrary
test_ctypes = so('./test_ctypes.so')
test_ctypes_ins = test_ctypes.get_instance(4)
print test_ctypes.get_num(test_ctypes_ins)

输出结果是:4

------ 本文结束 ------
k