2014-06-30 24 views
1

我用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" 
+1

很難說沒有更多的代碼,但這看起來像它可能是相關的東西http://stackoverflow.com/questions/16840706/use-method-inherited-from-abtract-c-class-in -a-python-class-swig ...如果是這樣,請嘗試定義'__init__',然後調用你的超級構造函數。 – ftwl

+0

我的答案的第一部分:http://stackoverflow.com/questions/9040669/how-can-i-implement-ac-class-in-python-to-be-called-by-c/9042139#9042139應該做一個完整的例子。 – Flexo

+0

您是否按照SWIG文檔中描述的方式嘗試使用'%feature(「director」)',並且如發行版附帶的SWIG示例中所示?請顯示您使用的.i文件。 – Schollii

回答

0

它看起來像你在模塊級缺失使董事定義。您.i文件的第一行必須是:

%module(directors="1") MdApi 

從​​:

導演功能默認是關閉的。要使用導向器,您必須對接口文件進行兩處更改。首先,向%module指令添加「董事」選項,如下所示:

%module(directors="1") modulename 

沒有此選項,將不會生成導向器代碼。其次,你必須使用%feature("director")指令來告訴SWIG哪些類和方法應該得到導向器。

+0

哦,你說得對。這是一個愚蠢的錯誤!謝謝,它解決了我的問題! – Crazymooner

相關問題