2011-11-13 27 views
7

Tôi đang cố gắng sử dụng Boost.Python làm trình bao bọc cho hàm C++ nhận con trỏ, sửa đổi dữ liệu (được quản lý ở phía Python dưới dạng mảng numpy chẳng hạn) và trả về. Làm thế nào để tôi nhận được Python numpy và Boost.Python để cộng tác và cung cấp cho tôi con trỏ thô bên trong hàm?Làm thế nào để vượt qua một con trỏ nguyên để Boost.Python?

#include <boost/python.hpp> 
namespace 
{ 
    char const *greet(double *p) 
    { 
    *p = 2.; 
    return "hello world"; 
    } 
} 
BOOST_PYTHON_MODULE(module) 
{ 
    boost::python::def("greet", &greet); 
} 

Trong Python khi tôi cố gắng,

import numpy as np 
a = np.empty([2], dtype=np.double) 
raw_ptr = a.data 
print cmod.greet(raw_ptr) 

tôi nhận được lỗi,

Boost.Python.ArgumentError: Python argument types in 
<...>.module.greet(buffer) 
did not match C++ signature: 
greet(double*) 

Trả lời

3

Một cách có vẻ hiệu quả, được đề xuất bởi Andreas Kloeckner, các nhận xét và lựa chọn thay thế được hoan nghênh. Các Greet() được sửa đổi như sau,

char const *greet(boost::python::object obj) { 
    PyObject* pobj = obj.ptr(); 
    Py_buffer pybuf; 
    if(PyObject_GetBuffer(pobj, &pybuf, PyBUF_SIMPLE)!=-1) 
    { 
     void *buf = pybuf.buf; 
     double *p = (double*)buf; 
     *p = 2.; 
     *(p+1) = 3; 
     PyBuffer_Release(&pybuf); 
    } 
    return "hello world"; 
    } 

bằng Python chỉ cần sử dụng:

print cmod.greet(a) 
0

Bạn có thể sẽ cần phải sử dụng giao diện ctypes NumPy để có được một con trỏ liệu để lưu trữ , và sau đó làm cho một con trỏ ctypes để tăng gấp đôi để đi vào cuộc gọi. ndarray.data là loại bộ đệm chứ không phải con trỏ.

tôi không có bất kỳ kinh nghiệm với boost.python, nhưng tôi nghi ngờ điều gì đó như

In [28]: x=np.array([1,2,3,4],dtype=np.double) 

In [29]: p=x.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) 

In [30]: type(p) 
Out[30]: <class 'ctypes.LP_c_double'> 

sẽ làm việc nếu truyền cho một hàm C++ bọc mong đợi một con trỏ như một cuộc tranh cãi.

+0

Vâng, tôi đã cố gắng điều đó quá. Thông báo lỗi sau đó đọc, Boost.Python.ArgumentError: Các loại đối số Python trong <...> .module.greet (LP_c_double) không khớp với chữ ký C++: chào (double *) – rych

Các vấn đề liên quan