使用ctypes覆盖库中的可访问结构

2024-09-30 10:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中使用C库,我使用ctypes来实现这一点。你知道吗

我在库中定义了要访问的结构,我想在Python程序中创建这些结构的多个实例,并用其中一个实例覆盖C库中的结构,让它计算,然后用实例中的另一个实例覆盖它。 基本上,我想用其他参数覆盖链接到库的结构的字段,而不必手动更改每个参数。你知道吗

示例:

from ctypes import *

class Example(Structure):
    _pack_ = 1
    _fields_ = [("One", c_uint8),
                ("Two", c_double),
                ("Three", c_double)]


lib = cdll['./test.dll']
libInit = lib['init']
libStep = lib['step']
libClose = lib['close']

libInit()

In1 = Example
In1.One = 2
In1.Two = 10
In1.Three = 23

In2 = Example
In2.One = 3
In2.Two = 4
In2.Three = 50

In = Example.in_dll(lib, "Example")
In = In1

libStep()

Out = Example.in_dll(lib, "Example")

In = In2

libStep()

Out = Example.in_dll(lib, "Example")

libClose()

我知道像我在示例中那样覆盖In参数是行不通的,因为它会删除到C库的链接。有没有办法用某种方式覆盖它?你知道吗


Tags: 实例in参数examplelibctypes结构one
1条回答
网友
1楼 · 发布于 2024-09-30 10:40:05

在结构类中创建一些辅助对象。您必须修改in_dll变量,但可以使其更简单:

测试.c

#include <stdint.h>
#include <stdio.h>

#pragma pack(push,1)
__declspec(dllexport) struct Example
{
    uint8_t One;
    double Two;
    double Three;
} Example;
#pragma pack(pop)

__declspec(dllexport) void libInit()
{
}

__declspec(dllexport) void libStep()
{
    Example.One += 1;
    Example.Two += 2;
    Example.Three += 3;
}

__declspec(dllexport) void libClose()
{
}

Python:

from ctypes import *

class Example(Structure):
    _pack_ = 1
    _fields_ = [("One", c_uint8),
                ("Two", c_double),
                ("Three", c_double)]
    def set(self,a,b,c):
        self.One = a
        self.Two = b
        self.Three = c
    def __repr__(self):
        return 'Example({},{},{})'.format(self.One,self.Two,self.Three)

lib = CDLL('test')

libInit = lib.libInit
libInit.argtypes = None
libInit.restype = None

libStep = lib.libStep
libStep.argtypes = None
libStep.restype = None

libClose = lib.libClose
libClose.argtypes = None
libClose.restype = None

example = Example.in_dll(lib,'Example')

libInit()
example.set(1,2,3)
print(example)
libStep()
print(example)
libStep()
print(example)
example.set(2,2,2)
libStep()
print(example)
libClose()

输出:

Example(1,2.0,3.0)
Example(2,4.0,6.0)
Example(3,6.0,9.0)
Example(3,4.0,5.0)

相关问题 更多 >

    热门问题