我有一个使用函数的简单库 其中一个API中的hello_printf(const char * format,...)。使用时 在C中的这个库中,我将hello_printf的函数指针指向 使用库和代码在外部应用程序中的printf可以无缝地工作。
hello_printf不是API,而是用于实现一个 API的。原因是我想要外部应用程序 使用该库提供printf(外部绑定)的实现。
现在我想在python中使用这个库,并且我使用ctypes来调用API,但我无法找到一种方法来查找使用ctypes提供函数的外部绑定。 即将hello_printf()指向libc的printf,使其成为“hello_printf = libc.printf”。
答案 0 :(得分:3)
您正在寻找ctypes数据类型的in_dll
方法。
C:
#include <stdlib.h>
int (*hello_printf)(const char *format, ...) = NULL;
int test(const char *str, int n) {
if (hello_printf == NULL)
return -1;
hello_printf(str, n);
return 0;
}
ctypes的:
from ctypes import *
cglobals = CDLL(None)
lib = CDLL("./lib.so")
hello_printf = c_void_p.in_dll(lib, "hello_printf")
hello_printf.value = cast(cglobals.printf, c_void_p).value
>>> lib.test("spam %d\n", 1)
spam 1
0