项目中要对一个用 C 编写的 .so 库进行逻辑自测。这项工作,考虑到灵活性,我首先考虑用 Python 来完成。
研究了一些资料,采用 python 的 ctypes 来完成这项工作。已经验证通过,本文记录一下适配流程。验证采用 cpp 来设计,不过暂时还没有涉及类的内容。以后如果需要再补足。
参考资料
ctypes
以下资料是关于 ctypes 的,也就是本文采用的资料:
一些 Python 本身的资料
由于研究 ctypes 时我用的是 Python 2.7,后来切换到 Python 3 的时候稍微遇到一点适配问题,因此也顺便记录一下我切换过程中参考的一些资料:
其他 python 调用 C 的方法
Python 调用 C 还有其他的几个解决方案,比如 cython、SWIG 等等。但是查了不少资料没能解决我的两个关键诉求(结构体参数和回调函数):
环境准备
ctypes 包准备
使用 ctypes,需要首先安装 python-dev 包:
Ubuntu:
$ sudo apt-get install python-dev -y
CentOS:
$ sudo yum install python-devel -y
这里主要包含了 ctypes 包。
.so 文件准备
将你的 C 代码编译成 .so 文件。这里假设目标文件是 libtest.so,放在工作目录下。
基本参数函数调用
首先是最简单的函数调用,并且函数参数为基本数据类型。待调用的函数定义如下:
extern "C" int max(int a, int b)
{
return (a > b) ? a : b;
}
这种情况下,在 Python 中的调用就很简单了。我们需要使用 ctypes 包中的 cdll 模块加载 .so 文件,然后就可以调用库中的函数了。
Python 代码如下:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
from ctypes import *
so_file = cdll.LoadLibrary('./libtest.so') # 如果前文使用的是 import ctypes,则这里应该是 ctypes.cdll.LoadL