Python Quickfix GetString () имеет Coredump ИЛИ Unicode Encode Error для строк> = 16 символов - PullRequest
0 голосов
/ 23 января 2019

Следующий фрагмент кода (в классе, производном от quickfix.Application) coredumps / SIGSEGV при получении QuoteReqID в виде строки. Я поиграл с размером QuoteReqID и заметил, что строковые поля со значениями <16 символов обрабатываются очень хорошо, а строковые поля со значениями выше этого предела - нет, что приводит к возможному SIGSEGV или UnicodeEncodeError. Похоже, что это проблема со слоем SWIG, который использует Quickfix, особенно с python3. Я просто хотел посмотреть, делаю ли я что-то не так или уже есть обходной путь. </p>

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)

Кажется, я не могу продублировать условия, необходимые для coredump против UnicodeEncodeError. Когда происходит UnicodeEncodeError, вот как это выглядит в журналах FIX:

15 Characters
Original String=samplequotereqs
131=samplequotereqs

16 Characters
Original String=samplequotereqs
131=        otereqs1

Во втором примере это не пробелы, предшествующие 'otereqs1', а скорее белый прозрачный вертикальный символ Юникода, который, я думаю, U + 25AF.

1 Ответ

0 голосов
/ 24 января 2019

Способ доступа к полям был неверным. Это правильный путь:

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())
...