标题题所建议的,我尝试使用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传递回去,让它附加来自不同文件的数据。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐