Я пытаюсь открыть библиотеку 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это как-то связано с передачей необработанного указателя, но я не совсем понимаю, что еще мне следует делать ...