Конструкторы необработанных указателей Boost-Python - PullRequest
0 голосов
/ 23 июня 2010

Я пытаюсь открыть библиотеку C ++ для python, используя boost-python.Библиотека на самом деле оборачивает лежащий в основе C api, поэтому часто использует необработанные указатели.

// implementation of function that creates a Request object
inline Request Service::createRequest(const char* operation) const
{
    blpapi_Request_t *request;
    ExceptionUtil::throwOnError(
            blpapi_Service_createRequest(d_handle, &request, operation)
        );
    return Request(request);
}

// request.h
class Request {
    blpapi_Request_t *d_handle;
    Element           d_elements;
    Request& operator=(const Request& rhs); // not implemented
public:
    explicit Request(blpapi_Request_t *handle); 
    Request(RequestRef ref);
    Request(Request &src);
};

// request.cpp
BOOST_PYTHON_MODULE(request)
{
    class_<blpapi_Request_t>;
    class_<Request, boost::noncopyable>("Request", init<blpapi_Request_t *>())
    .def(init<Request&>())
    ;
}

Хотя request.cpp успешно компилируется, когда я пытаюсь использовать объект, я получаю следующую ошибку:

// error output
TypeError: No to_python (by-value) converter found for C++ type: class Request

Для вызова этого кода Python выглядит так:

from session import *
from service import *
from request import *

so = SessionOptions()
so.setServerHost('localhost')
so.setServerPort(8194)

session = Session(so)

# start sesssion
if not session.start():
    print 'Failed to start session'
    raise Exception

if not session.openService('//blp/refdata'):
    print 'Failed to open service //blp/refdata'
    raise Exception

service = session.getService('//blp/refdata')
request = service.createRequest('ReferenceDataRequest')

Другие объекты (SessionOptions, Session, Service) и т. Д. Также являются объектами c ++, для которых я успешно создал обертки boost-python.

Как я понимаю из документов boost-pythonэто как-то связано с передачей необработанного указателя, но я не совсем понимаю, что еще мне следует делать ...

1 Ответ

1 голос
/ 24 июня 2010

Ваш class_<blpapi_Request_t>; ничего не декларирует;Является ли этот код верной версией?

Если это так, то обновите его:

class_<blpapi_Request_t>("blpapi_Request_t");

Тем не менее, эта ошибка указывает на то, что вы пытаетесь использовать объект Request с автоматическим преобразованиемк объекту python, который не был определен.

Причина, по которой вы получаете эту ошибку, заключается в том, что вы завернули запрос как boost :: noncopyable, а затем предоставили фабричный метод, который возвращает объект запроса по значению;boost :: noncopyable означает, что конструкторы копирования не генерируются, и, следовательно, нет автоматического конвертера в python.

Два пути из этого: один - удалить некопируемую подсказку;другой - зарегистрировать конвертер, который принимает запрос C ++ и возвращает объект запроса Python.Вам действительно нужна не копируемая семантика для Request?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...