Доступ к UtcTimeStamp из Python через SWIG

Я думаю, что это вопрос python vs SWIG больше, чем что-либо еще...

Я использую пакет C++ с привязками SWIG Python. Один из объектов, которые я получаю, — это отметка времени UTC, из которой я пытаюсь извлечь отметку времени.

Объект имеет следующие характеристики:

>>> print type(obj)
<type 'SwigPyObject'>

>>> print dir(obj)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__hex__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__ne__', '__new__', '__oct__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'acquire', 'append', 'disown', 'next', 'own']

>>> print obj
<Swig Object of type 'UtcTimeStamp *' at 0x0379F320>

Как извлечь из него данные?


ОБНОВЛЕНИЕ:
я нашел UTCTimeStamp< /a>, производный от структуры DateTime — это часть пакета QuickFix с открытым исходным кодом.

Однако я до сих пор не знаю, как получить доступ к данным. DateTime имеет простые функции получения, такие как getYear(), но как мне получить к ним доступ?


person Jonathan    schedule 22.07.2011    source источник
comment
Вы выяснили, какая функция c в вашей библиотеке может забрать у вас указатель временной метки?   -  person agf    schedule 23.07.2011
comment
нет, я все еще немного в растерянности, как продолжить...   -  person Jonathan    schedule 23.07.2011
comment
После того, как вы import quickfix, вы сможете найти правильный способ вызова, посмотрев на quickfix.__dict__, а затем на __dict__ класса (на случай, если я ошибся с заглавными буквами или что-то в этом роде) в моем редактировании.   -  person agf    schedule 23.07.2011


Ответы (2)


Вместо использования qfTimeField.getValue() в поле времени используйте qfTimeField.getString(), а затем просто strptime() результирующую строку. Например:

qfSendingTime = fix.SendingTime()
message.getHeader().getField(qfSendingTime)
my_datetime = datetime.strptime(qfSendingTime.getString(), '%Y%m%d-%H:%M:%S.%f')
person bavaza    schedule 07.02.2013
comment
Это очень хороший ответ, и я сам так делаю. Однако вы должны знать, что в некоторых случаях strptime может дать сбой. Это известная ошибка в python, связанная с многопоточностью, см. stackoverflow.com/questions/16309650/ Когда это происходит, вы можете обойти это, просто вызвав qfSendingTime.getString() и забыв о strptime. Затем введите строку даты в другой тип, когда вам нужно использовать ее для чего-то. - person Wapiti; 02.04.2015

Вы пробовали obj.getYear()? Из документации следует, что UTCTimeStamp происходит от DateTime, поэтому вы должны иметь доступ к методам родительского класса.

Если это не сработает, какой объект вы получите, если сделаете newobj = obj.next()? Вы пробовали print obj.__doc__?

Изменить: с http://www.swig.org/Doc1.3/Python.html#Python_nn27a:

Это значение указателя можно свободно передавать различным функциям C, которые ожидают получить объект типа... Единственное, что вы не можете сделать, это разыменовать указатель из Python.

Поэтому вам нужно передать его оболочке для функции C++, которая может принимать DateTime. Я не знаю конкретно, что это такое, так как я не знаю, что вы упаковываете.

В данном случае это http://www.quickfixengine.org/quickfix/doc /html/struct_f_i_xobj.getYear()1_utc_time_stamp_convertor.html. Я считаю, хотя я не могу это проверить, что вы называете это с помощью:

import quickfix
converter = quickfix.UtcTimeStampConverter()
string = converter.convert(obj)
person agf    schedule 22.07.2011
comment
да, я попробовал obj.getYear() и получил: AttributeError: 'SwigPyObject' object has no attribute 'getYear' - person Jonathan; 23.07.2011
comment
print obj.__doc__ возвращает Swig object carries a C/C++ instance pointer - person Jonathan; 23.07.2011