我用swig將一些C++ Api包裝到Python中。如何將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.i。無論MdApi和MdSpi在ThostFtdcMdApi.h
%module MdApi
%{
#include "ThostFtdcMdApi.h"
%}
%feature("director") CThostFtdcMdSpi;
%feature("director") CThostFtdcMdApi;
%include "ThostFtdcMdApi.h"
很難說沒有更多的代碼,但這看起來像它可能是相關的東西http://stackoverflow.com/questions/16840706/use-method-inherited-from-abtract-c-class-in -a-python-class-swig ...如果是這樣,請嘗試定義'__init__',然後調用你的超級構造函數。 – ftwl
我的答案的第一部分:http://stackoverflow.com/questions/9040669/how-can-i-implement-ac-class-in-python-to-be-called-by-c/9042139#9042139應該做一個完整的例子。 – Flexo
您是否按照SWIG文檔中描述的方式嘗試使用'%feature(「director」)',並且如發行版附帶的SWIG示例中所示?請顯示您使用的.i文件。 – Schollii