Python中调用C语言库,结构体中嵌套了枚举该如何创建对应的Python类?😭😭😭
各位大佬,有 2 个问题需要请求一下,感激不尽😭
1、单独的结构体,可以直接用 python 的类来创建,但这结构体里边嵌套了一个枚举,应该怎么创建这种结构体啊
typedef struct
{
AttrType eType;
int nValue;
float fScore;
}T_Result;
typedef enum
{
A = 0,
B = 1,
C = 2,
D = 3,
}AttrType;
2、python 调用 C 函数,遇到二级指针,如何传参数呢?以下我的办法不可用
// C 函数原型, 伪代码:
A(IF_UINT8 ** A1)
{
xx
return 0;
}
typedef unsigned char IF_UINT8;
# python 调用
dll = CDLL("test.dll")
dll.A.argtypes = [POINTER(POINTER(c_ubyte))]
args= POINTER(c_ubyte)()
dll.A(byref(args))
# 这样报错:OSError: exception: access violation reading 0x0000000000000004
Python中调用C语言库,结构体中嵌套了枚举该如何创建对应的Python类?😭😭😭
- 试试直接用 int
2. 需要代码才知道具体该怎么办
在Python里调用C库,处理嵌套枚举的结构体,用ctypes可以这么干。
假设你的C头文件是这样的:
typedef enum {
MODE_A = 0,
MODE_B = 1
} Mode;
typedef struct {
int id;
Mode mode;
} Device;
对应的Python ctypes定义:
from ctypes import *
# 先定义枚举
class Mode(c_int):
MODE_A = 0
MODE_B = 1
# 再定义结构体
class Device(Structure):
_fields_ = [
("id", c_int),
("mode", Mode) # 直接使用上面定义的枚举类型
]
# 使用示例
dev = Device()
dev.id = 100
dev.mode = Mode.MODE_B
print(dev.id, dev.mode) # 输出: 100 1
如果枚举在C里是enum,ctypes里通常用c_int对应就行。
注意结构体字段顺序和类型必须和C声明完全一致。
总结:按C的声明顺序在Python里先定义枚举再定义结构体就行。
C 代码:
// dll1.h
#pragma once
#define EXPT __declspec(dllexport)
extern “C” {
EXPT void A(int** arg);
}
// dll1.cpp
#include “stdafx.h”
#include "Dll1.h"
void A(int** arg) {
printf(“arg = %d”, **arg);
}
Python 代码:
from ctypes import cdll
from ctypes import POINTER, cast
from ctypes import c_int
dll = cdll.LoadLibrary(“Dll1.dll”)
dll.A.argtypes = [POINTER(POINTER(c_int))]
p_x = POINTER(c_int)
List_int = [(5,)]
List = (c_int11)(List_int)
List_p = []
List_p.append(cast(List[0], p_x))
p2ci = (p_x1)(*List_p)
# 调用
dll.A(p2ci)
PS: 我也是查找资料才找到类似的, 以上代码可运行成功
我这个是 unsigned char 的二级指针,你的例子好像跟我这个不太一样,多谢
唉,打不开啊
我写的是 int 的二级指针,应该替换一下就行了吧

