如何使用SWIG封装一个C++函数,它引用了一个结构向量作为输入和输出,用于Python?

2024-09-30 01:20:54 发布

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

标题题所建议的,我尝试使用SWIG来封装C++中定义的函数,它作为变量之一引用了作为输入和输出(在C++中通用)的结构向量,以便函数可以在Python中使用。你知道吗

我在Visual Studio 2015(v140编译器)中使用SWIG版本4.0.0和Python 3.6 64位。你知道吗

以上突出的问题是C++中的常见实践,因此,无法找到一个例子来描述如何使用SWIG来实现C++中定义的函数,以便在Python中使用。以下链接是我能找到的最接近的例子:

Use struct in SWIG argout typemap

How to pass list of structs to C in SWIG/Python

但他们没有帮助解决以下问题:

我尝试的第一件事是在SWIG接口文件中使用带有INOUT选项的typemaps,该选项由以下公式给出:

/* File : ParserLib.i */
%module ParserLib
%include "typemaps.i"
%include "std_vector.i" 

%{
#include "Structures.h"
#include "Read.h"
%}

%apply int *INOUT { int &nNumber };
%apply std::vector<stData> *INOUT { std::vector<stData> &data };

%include "Structures.h"
%include "Read.h"

%template(Struct) std::vector<stData>;

其中stData是在Structures.h中定义的结构,而同时引用nNumber和data的函数声明是在Read.h中

但是,当我尝试编译接口文件时,会收到警告消息:

警告453:无法应用(std::vector<;stData>;*INOUT)。未定义类型映射。你知道吗

所以我做了进一步的搜索,找到了博客:

How do I use SWIG typemaps to marshall structure members from C++ to C# using P/Invoke?

基本上是这样回答的:

“。。。你能用结构向量来代替吗?我通过简单地包含std\u vector.I和相关类型映射来传递结构或自定义对象的向量没有问题,例如:

%include "std_vector.i

%typemap(MyClassVec) std::vector<MyClass>; 

““

所以我试着补充:

%typemap(vecOfStruct) std::vector<stData>; 

到接口文件(上面提供的)上面的位置调用应用,但编译接口文件时仍然得到相同的警告消息。你知道吗

现在我知道这只是一条警告消息,接口文件仍然可以编译,但是我没有得到在Python中使用apply with INOUT时所期望的通常行为,即,向函数中输入一个变量并获得函数返回的输出。你知道吗

我还应该指出,模板定义:

%template(vecOfStruct) std::vector<stData>;

允许我在Python中定义一个结构向量并传递到函数调用中—这是必要的,否则会出现typedef不匹配错误—实际运行,但在Python中工作时会出现一些异常行为。你知道吗

下面是我用来运行SWIG包装的c++库的Python脚本示例:

from ParserLib import vecOfStruct, Read

vecOfStruct = vecOfStruct()
Read = Read()

file = "file path and name to be read in"

tempNum = Read.ReadData(file, vecOfStruct, 0)
print(int(tempNum[1]))
v0 = vecOfStruct[0].data1
print(v0)

tempNum = Read.ReadData(file, vecOfStruct, tempNum[1])    

现在,函数调用将tempNum填充为一个列表(或数组),其中包含以下值:

[<Swig Object of type 'BOOL *' at 0x0000000005248300>, 100],

因此,为什么要调用列表中的第二个元素来打印结果;但我不确定第一个元素指的是什么。有趣的是,我仍然能够从vecOfStruct(python中的一个类)访问信息,而不需要将它设置为函数调用的返回值。但是,当我尝试调用read函数并将vecOfStruct作为输入传入时,它不会附加到第一个函数调用的(现在填充的)vecOfStruct。你知道吗

其目的是将函数调用为:

Struct, tempNum = Read.ReadData(1, Struct, 0)

在循环中,可以将vecOfStruct传递回去,让它附加来自不同文件的数据。你知道吗


Tags: 文件to函数read定义include结构swig

热门问题