【发布时间】:2010-06-23 09:12:24
【问题描述】:
我正在尝试使用 boost-python 向 python 公开一个 C++ 库。该库实际上包装了一个底层 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)等也是我已成功为其创建 boost-python 包装器的 c++ 对象。
据我从 boost-python 文档了解到,这与传递原始指针有关,但我真的不明白我还应该做什么......
【问题讨论】: