我在C库中有这样的结构。DataFn中的函数指针指向静态函数。
。H
struct Data {
int i;
int *array;
};
typedef struct {
bool (* const fn1) (struct Data*, const char *source);
....
} DataFn;
extern DataFn const DATAFUNC
使用objdump,该表仅包含DATAFUNC和gcc的其他内容。
这在C语言中很好,在其中调用fn1就像DATAFUNC.fn1(…,…),但是这样的东西如何包装起来,以便可以在python w /
ctypes中调用fn1呢?
python示例
libc = ctypes.cdll.LoadLibrary("./data.so")
print(libc.DATAFUNC)
结果是 <_FuncPtr object at 0x6ffffcd7430>
这是相似的,但是没有工厂功能。
[Python 3.Docs]:ctypes-
Python的外部函数库
包含解决此问题所需的一切。
我相信缺少的主要部分是 ctypes 类型的 in_dll 方法( 访问从dll* 部分 导出的值 )。 __ *
除此之外,为了使用 C 数据,您需要让 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};
code00.py :
#!/usr/bin/env python3
import sys
from ctypes import c_int, c_char_p, Structure, CDLL, CFUNCTYPE, POINTER, byref
class 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".encode())
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]> ls c.c c.h code00.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 code.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
code00.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
问题内容: 我正在尝试使用Python ctypes访问DLL文件中的函数。提供的功能说明如下。 该函数引用DLL中定义的一些变量类型。接下来介绍这些变量 请注意,在提供的头文件之一中定义了“ pichar”,如下所示: 这似乎很简单,但是出于某种原因对我来说却无法解决。 我的理解如下:我向函数传递了三个变量: 1)一个,实际上是一个。有人告诉我python ctypes本质上不支持枚举,因此我将
问题内容: 我正在使用一个包含单个调用的.dll,该调用返回一个函数指针数组。GetMyApi()返回指向结构的指针,该结构是函数指针的数组。函数本身具有不同的单独输入和输出。到目前为止我尝试过的是: 我无法轻易更改的C代码: C中的代码: { int (__cdecl IsValidInt)(int i); int (__cdecl InvalidInt)(); int (__cdecl *Is
问题内容: 我已经看过其他答案,但似乎无法解决这个问题。我正在尝试在DLL中调用一个函数以与SMBus设备进行通信。此函数采用指向结构的指针,该结构具有一个数组作为字段之一。所以… 在C中: 我想我必须在DLL填充数据数组时为Address,Command和BlockLength设置值。需要此结构的函数将其作为指针 因此,我已经像这样在Python中设置了结构: 注意:我也尝试过ctypes.c_
本文向大家介绍C#静态构造函数?相关面试题,主要包含被问及C#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数
问题内容: 我正在使用ctypes在Python中实现C 函数。C 函数应返回一个指向数组的指针。不幸的是,我还没有弄清楚如何在Python中访问数组。我尝试了numpy.frombuffer,但是没有成功。它只是返回一个任意数字的数组。显然我没有正确使用它。这是一个简单的示例,数组大小为10: function.cpp的内容: wrapper.py的内容: 要编译我正在使用的C ++文件: 您对
C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第