[Python 3.Docs]:ctypes-
Python的外部函数库包含解决此问题所需的一切。
我相信缺少的主要部分是 ctypes 类型的 in_dll 方法( 访问从dll* 部分 导出的值 )。 __ *
除此之外,为了使用 C 数据,您需要让 Python 知道数据格式。这适用于:
- 结构 s。通过子类定义 Python 副本
ctypes.Structure
- 函数指针(适用于您的情况)。使用定义它们
ctypes.CFUNCTYPE
我准备了一个简化的示例来说明上述内容。请注意,为了简化操作,我没有进行任何错误处理(检查 NULL ( 应该是 ))。
ch :
struct Data { int i;};typedef struct { int (* const fn1) (struct Data*, const char*);} DataFn;extern DataFn const DATAFUNC;抄送 :
#include <stdio.h>#include "c.h"static int func1(struct Data *pData, const char *source) { printf("From C - Data.i: [%d], source: [%s]n", pData->i, source); return -255;}DataFn const DATAFUNC = {&func1};pre00.py :
#!/usr/bin/env python3import sysfrom ctypes import c_int, c_char_p, Structure, CDLL, CFUNCTYPE, POINTER, byrefclass Data(Structure): _fields_ = [ ("i", c_int), ]fn1_type = CFUNCTYPE(c_int, POINTER(Data), c_char_p)class DataFn(Structure): _fields_ = [ ("fn1", fn1_type), ]def main(): data = Data(127) dll = CDLL("./c.so") data_func = DataFn.in_dll(dll, "DATAFUNC") ret = data_func.fn1(byref(data), "abcd".enpre()) print("DATAFUNC.fn1 returned {:d}".format(ret))if __name__ == "__main__": print("Python {:s} on {:s}n".format(sys.version, sys.platform)) main()输出 :
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> lsc.c c.h pre00.py[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> gcc-shared -fPIC -o c.so c.c
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> ls
c.c c.h pre.py c.so
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> objdump
-t c.so | grep DATAFUNC
0000000000200e10 g O .data.rel.ro 0000000000000008
DATAFUNC
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> python3
pre00.py
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linuxFrom C - Data.i: [127], source: [abcd]DATAFUNC.fn1 returned -255



