我有一些用C写的函数,我想在Python中运行,并且在尝试访问typedef结构时遇到了一些意想不到的结果。这里是一个最小的可重复的例子。最后,我的问题是如何访问存储在python代码中的共享库中的全局c结构,或者在头文件中定义的typedef,以便在python中重新创建相同的结构。也许我用来编译SO文件的方法没有创建全局变量?:
temp.c文件:
#include "temp.h"
aStruct_t aStruct = {0};
extern void AdderFunction(aStruct_t *struct1, int num)
{
struct1->y = struct1->x;
struct1->x += num;
}
字符串
temp.h文件
#ifndef _TEMP_H_
#define _TEMP_H_
#include <stdint.h>
typedef struct aStruct_t
{
uint32_t x;
uint32_t y;
uint32_t z;
} aStruct_t;
extern void AdderFunction(aStruct_t *struct1, int num);
#endif
型
我把它编译成一个so文件:
gcc -shared -o temp.so -fPIC temp.c
型
我希望能够访问Python中的C结构aStruct
例如,在
import ctypes
so_file = "../temp.so"
tempLib = ctypes.CDLL(so_file)
tempLib.aStruct.y
型
但得到错误AttributeError: '_FuncPtr' object has no attribute 'y'
我很惊讶typedef结构是函数指针类型?这是为什么?
我可以通过在python中创建一个类似的结构来解决这个问题,但是这是不可取的,因为我在C代码中有几个相当大的typedef结构,每次我更新结构时,我也必须更新我的python代码。
import ctypes
so_file = "../temp.so"
tempLib = ctypes.CDLL(so_file)
# tempLib.aStruct.y
class aStruct_python(ctypes.Structure):
_fields_ = [("x1",ctypes.c_uint),
("y1",ctypes.c_uint),
("z1",ctypes.c_uint)]
tempLib.AdderFunction(ctypes.pointer(struct_py),2)
型
1条答案
按热度按时间v1uwarro1#
你不能不声明结构。DLL中只有导出的C函数和全局变量的名称可用。
使用
<type>.in_dll()
访问DLL中的全局变量。dll的属性只能是导出函数的名称。下面是一个完整的例子:
test.c
字符串
test.py
型
输出量:
型