gpt4 book ai didi

python - 使用 Swig 传入指向缓冲区的指针,结果为 "TypeError"

转载 作者:行者123 更新时间:2023-11-30 16:22:38 25 4
gpt4 key购买 nike

我们有一个嵌入式系统,可以对数据缓冲区执行处理。当缓冲区填满时,处理由中断触发。我们的愿望是用模拟输入数据测试算法。我们的数据科学团队使用 Python,算法是用 C 开发的,所以我提出为他们创建一个包装器。

该问题围绕传递到算法中的缓冲区指针展开。

作为一个简单的示例,C 函数如下所示:

float FakeCalc( unsigned int *dataBuffer,
float *calcSpace,
int arg1,
float arg2,
int arg3,
int arg4,
int *intermediateResults
);

我创建了一个 SWIG 接口(interface)文件,如下所示:

%module fakeCalc

%include "typemaps.i"
%apply unsigned int * INPUT { unsigned int * dataBuffer };
%apply float * INOUT { float * calcSpace };
%apply int * OUTPUT { int * intermediateResults };

%{
extern float FakeCalc( unsigned int * dataBuffer,
float * calcSpace,
int winAvgSz,
float eleMulSign,
int denomWindNum,
int winSz,
int * intermediateResults
);
%}

extern float FakeCalc( unsigned int * dataBuffer,
float * calcSpace,
int winAvgSz,
float eleMulSign,
int denomWindNum,
int winSz,
int * intermediateResults
);

这会创建界面,所以我想我已经可以开始了。

在交付之前用 python 进行简单的测试实现如下所示:

#!/usr/bin/python 

from numpy import zeros
from array import array

import sys

import fakeCalc

def printHelp():
print "testRun.py dataFile"

# Buffer to pass into method for scratch space
scratchBuf = zeros(10)

# Read in data to pass into method
if len(sys.argv) != 2:
printHelp()
exit()

dataFile = open(sys.argv[1], "r")

dataArr = array("I")

for dataPoint in dataFile:
dataArr.append(int(dataPoint[0:-1]))

# Run calculations
fakeCalc.FakeCalc(dataArr, scratchBuf, 10, 10.5, 10, 10)

有几点需要注意。我无法更改该函数的参数,因为它是多个代码库中使用的遗留代码。缓冲区大小的缺乏虽然显然不理想,但由于在硬件初始化时缓冲区是固定的,因此可以得到处理。

calcSpace传入的缓冲区被算法用作暂存空间,intermediateResults内部包含一些中间步骤的结果,dataBuffer只是原始数据,没有改变。

目前我正在得到 类型错误:在方法“FakeCalc”中,参数 1 类型为“unsigned int”

简而言之,这个问题是:是否可以在 Python 中分配这些缓冲区并传递到 C 中?

预先感谢您的帮助!

最佳答案

我找到了解决方案。

从 python 分配缓冲区并将其传入的一个简单方法是使用 swig 提供的“carrays”。这是一个例子:

%module processBuffer

%include "stdint.i"
%include "carrays.i"

%array_class(uint32_t, buffer);

%{
void processBuffer(unsigned int * buffer);
%}

void processBuffer(unsigned int * buffer);

在Python中,创建缓冲区并通过以下方式传入指针:

#!/usr/bin/python

import processBuffer

buffer = []

for x in range (0, 10):
buffer.append(x)

print buffer

test = processBuffer.buffer(10);
for x in range (0, 10):
test[x] = buffer[x]

processBuffer.processBuffer(test.cast())

到目前为止,这种方法没有任何问题。

对于那些感兴趣的人来说,了解一些背景知识,查看生成的代码,原始问题就变得清晰了。传入指针 SWIG 假设正在传递单个对象。为此,会创建一个临时对象以避免类型不兼容。这与数组有关。还有更复杂的解决方案也可以创建自定义类型映射,但上述解决方案要简单得多。

关于python - 使用 Swig 传入指向缓冲区的指针,结果为 "TypeError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54371634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com