Python Quickfix GetString()对于大于等于16个字符的字符串具有Coredump或Unicode编码错误

时间:2019-01-23 20:51:14

标签: python python-3.6 swig python-unicode quickfix

当检索QuoteReqID作为字符串时,以下代码片段(在来自quickfix.Application的类中)coredumps / SIGSEGV。我一直在处理QuoteReqID的大小,并注意到对值小于16个字符的字符串字段进行了很好的处理,但是对值大于该限制的字符串字段进行了处理,这最终导致了SIGSEGV或UnicodeEncodeError。看来这是Quickfix使用的SWIG层的问题,尤其是python3。我只是想看看我做错了什么,还是已经有解决方法了。

line.numbers <- rep(1:13,table2.10[,"freq"])
q.b <- rep(NA,B)
table2.10b <- table2.10
for (b in 1:B){
line.numbers.b <- sample(line.numbers,size=217,replace=TRUE)
table2.10b[,"freq"] <- table(factor(line.numbers.b,levels=1:13))
m.b <- optim(m$par,loglik,hessian=T,control=list(fnscale=-1),
d=table2.10b)
q.b[b] <- qgamma(0.95,m.b$par[1],m.b$par[2])
}
q.npb <- q.b
quantile(q.b,c(0.025,0.975))

我似乎无法复制coredump与UnicodeEncodeError所需的条件。确实发生UnicodeEncodeError时,这就是FIX日志中的样子:

import quickfix as fix

...

def fromApp(self, message, session_id):
    msg_type = fix.MsgType()
    message.getHeader().getField(msg_type)
    if msg_type.getString() is fix.MsgType_QuoteRequest:
        quote_req_id_field = message.getField(fix.QuoteReqID())
        quote_req_id = quote_req_id_field.getString()
        print(quote_req_id)

在第二个示例中,它不是'otereqs1'之前的空格,而是白色透明垂直unicode块字符,我认为是U + 25AF。

1 个答案:

答案 0 :(得分:0)

我访问字段的方式不正确。这是正确的方法:

def fromApp(self, message, session_id):
    msg_type = fix.MsgType()
    message.getHeader().getField(msg_type)
    if msg_type.getString() is fix.MsgType_QuoteRequest:
        quote_req_id = fix.QuoteReqID()
        message.getField(quote_req_id)
        print(quote_req_id.getValue())