使用ctypes向C / C ++库提供函数的外部定义

时间:2013-12-12 17:55:11

标签: c++ python c ctypes

我有一个使用函数的简单库 其中一个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”。

1 个答案:

答案 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