如何将python对象传递给需要指针类型的函数?

How can I pass a python object to a function which requires a pointer type

本文关键字:指针 类型 函数 python 对象      更新时间:2023-10-16

我使用swig将一些c++ Api封装到Python中。

c++ api是这样的

class CThostFtdcMdSpi
{
public:
virtual void OnFrontConnected(){};
virtual void OnFrontDisconnected(int nReason){};
virtual void OnHeartBeatWarning(int nTimeLapse){};
...
};
class MD_API_EXPORT CThostFtdcMdApi
{
public:
static CThostFtdcMdApi *CreateFtdcMdApi();
virtual void RegisterSpi(CThostFtdcMdSpi *pSpi) = 0;
...
}

MdSpi定义了一些回调函数行为。MdApi需要调用RegisterSpi(CThostFtdcMdSpi *pSpi)来注册这些回调函数这就是我想在python中使用的

class Quote(CThostFtdcMdSpi):
def OnFrontConnected(self):
    pass
def OnFrontDisconnected(self, *args):
    pass
md = CThostFtdcMdApi_CreateFtdcMdApi()
q = Quote()
md.RegisterSpi(q)

Python给出了这个错误信息:

def RegisterSpi(self, *args): return _MdApi.CThostFtdcMdApi_RegisterSpi(self, *args)
TypeError: in method 'CThostFtdcMdApi_RegisterSpi', argument 2 of type 'CThostFtdcMdSpi *'

这是我的mdapi。MdApi和MdSpi都在ThostFtdcMdApi.h

中定义。
%module MdApi
%{
#include "ThostFtdcMdApi.h"
%}
%feature("director") CThostFtdcMdSpi;
%feature("director") CThostFtdcMdApi;
%include "ThostFtdcMdApi.h"

看起来您缺少在模块级别启用董事。.i文件的第一行应该是:

%module(directors="1") MdApi

来自导演文档:

默认禁用director特性。要使用director,必须对接口文件进行两次修改。首先,将"directors"选项添加到%module指令中,如下所示:

%module(directors="1") modulename

如果没有这个选项,将不会生成任何董事代码。其次,你必须使用%feature("director")指令来告诉SWIG哪些类和方法应该获得董事。

相关文章: