有关Ctypes的基础知识在该文章中。

由于官方手册并未给出调用C++类的方法(也有可能我没找到)。

思考再三决定先封装C++类的接口,再整体封装C++文件,如下:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
using namespace std;

#ifdef __cplusplus
extern "C" {
#endif

class arraylist
{
public:
int size;
int *array;
public:
arraylist()
{
size=0;
array=NULL;
}
arraylist(int s)
{
size=s;
array=new int[size];
}
void insert(int loc,int num)
{
array[loc-1]=num;
}
};

arraylist arr(6);

int inse()
{
arr.insert(1,3);
return arr.array[0];
}

#ifdef __cplusplus
} // end extern "C"
#endif
  • 全局定义初始化类
  • 构造函数接口封装类的函数

使用可通过函数接口调用类的函数,如下:

1
2
3
4
5
6
7
8
from ctypes import cdll

# g++ -fPIC -shared class.cpp -o class.so

test = cdll.LoadLibrary(r".\Library_client\class.so")

a = test.inse()
print(a)

你可以在这里找到Test/class.cpp,在这里找到class.py。