2010-06-23 105 views
0

我想使用boost-python向python公開一個C++庫。該庫實際上包裝了一個底層C api,因此使用了很多原始指針。Boost-Python原始指針構造函數

// 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++對象。

當我從升壓Python文檔這個有事情做與周圍將原料指針理解,但我真的不知道我應該做些什麼?

回答

1

class_<blpapi_Request_t>;沒有聲明什麼;那個代碼是正確的版本?

如果是這樣,那麼更新:

class_<blpapi_Request_t>("blpapi_Request_t"); 

這就是說,這是什麼錯誤指示是,你要使用Request對象與自動轉換爲尚未定義的Python對象。

你得到這個錯誤的原因是你已經將請求包裝爲boost :: noncopyable,然後提供了一個工廠方法,它通過值返回一個Request對象; boost :: noncopyable意味着沒有拷貝構造函數被生成,因此沒有自動的to-python轉換器。

兩種方式:一種是刪除不可複製的提示;另一個是註冊一個轉換器,它接受一個C++請求並返回一個Python請求對象。你真的需要Request的不可複製語義嗎?

+0

我已編輯原始帖子以顯示調用createRequest的Python代碼 – m0nonoke 2010-06-24 07:42:38

+0

我編輯了我的答案。 python方面的用法給了我需要的提示,謝謝! – 2010-06-24 12:40:44