唔,调试了一下,貌似是CTP返回空指针,CTP-Python在包装层没有做处理,造成了段错误。包装层源文件:
--------------------------------------------------------------------------------
//file: wrapper_Trader.cpp
void MySpiWrapper::OnRspQryInstrument(CThostFtdcInstrumentField* pInstrument, CThostFtdcRspInfoField* pRspInfo, int nRequestID, bool bIsLast){
PyGILState_STATE gstate;
gstate=PyGILState_Ensure();
if (!PyObject_CallMethod(py_spi, (char*)"OnRspQryInstrument", (char*)"NNib", new_CThostFtdcInstrumentField(pInstrument), new_CThostFtdcRspInfoField(pRspInfo), nRequestID, bIsLast)){
PyErr_Print();
}
PyGILState_Release(gstate);
}
--------------------------------------------------------------------------------
CTP在响应时,回调参数中的 pRspInfo 有可能是空指针,struct.cpp 中的 new_CThostFtdcRspInfoField() 方法在生成 Python 对象时,发生段错误。
手工将原有的 :
--------------------------------------------------------------------------------
//file: struct.cpp
//响应信息
PyObject * new_CThostFtdcRspInfoField(CThostFtdcRspInfoField * p){
return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", p->ErrorMsg, p->ErrorID);
}
--------------------------------------------------------------------------------
修改为:
--------------------------------------------------------------------------------
//file: struct.cpp
//响应信息
PyObject * new_CThostFtdcRspInfoField(CThostFtdcRspInfoField * p){
if(p == 0){
return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", (char*)"", 0);
}
else{
return PyObject_CallMethod(mod, (char*)"CThostFtdcRspInfoField", (char*)"si", p->ErrorMsg, p->ErrorID);
}
}
--------------------------------------------------------------------------------
重新编译生成python库,段错误排除。
@lvsoft 老大也许可以考虑打个补丁。
【 在 enceladus (我爱小母牛) 的大作中提到: 】
: 我想起来了,在windows下调试时,好像碰到过类似的错误.不过一共也没几个. 直接在外面加了几个判断.
: 可以去查看下pyctp下面那个Agent.py文件中判断None的语句,交易用到的需要处理的也就是这几个.
: 这个是设计问题,应该用NullObject模式的.
: ...................