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类?😭😭😭

8 回复
  1. 试试直接用 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里是enumctypes里通常用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_x
1)(*List_p)

# 调用
dll.A(p2ci)


PS: 我也是查找资料才找到类似的, 以上代码可运行成功

我这个是 unsigned char 的二级指针,你的例子好像跟我这个不太一样,多谢

唉,打不开啊

我写的是 int 的二级指针,应该替换一下就行了吧

回到顶部