2013-09-05 39 views
6

Tôi đang sử dụng Boost Python, tôi tạo ra một vectơ lớn các số nguyên trong C++ và tôi muốn truy cập vectơ này bằng Python mà không cần sao chép nó.Chuyển con trỏ từ C++ sang Python/w tăng python?

Trong C++ Tôi có:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ReturnVectorPtr", ReturnVectorPtr, return_value_policy<manage_new_object>()); 
} 

vector<int>* ReturnVectorPtr() 
{ 
    return new vector<int>(); 
} 

Sau đó, trong python tôi có:

import myModule 
myModule.ReturnVectorPtr() 

Điều này gây Python sụp đổ, mặc dù tôi thậm chí không lưu trữ các giá trị trả về. Bất kỳ ý tưởng về những gì sai lầm của tôi là?

Chỉnh sửa:

Mã sau hoạt động để lấy dữ liệu trong vectơ từ C++ tới python, nhưng rò rỉ bộ nhớ. Các vectơ được sao chép và sau đó không được xử lý?

Trong C++:

BOOST_PYTHON_MODULE(myModule) 
{ 
    class_<vector<int>>("vectorInt").def(vector_indexing_suite<vector<int>>()); 
    def("ModifyVectorInPlace", ModifyVectorInPlace); 
} 

void ModifyVectorInPlace(vector<int>& data) 
{ 
    // Modify data... 
    return; 
} 

Sau đó, trong python tôi có:

import myModule 
vectorInt = myModule.vectorInt() 
myModule.ModifyVectorInPlace(vectorInt) 

là gì đang xảy ra?

Chỉnh sửa 2:

Tôi đã thử các "liệu C++ con trỏ" ví dụ từ đây, một cách chính xác: https://wiki.python.org/moin/boost.python/PointersAndSmartPointers

Nó bị treo quá. Dường như tôi không thể có được một con trỏ đến bất cứ điều gì thông qua vào Python vì một lý do ...

Sửa 3:

Vụ tai nạn dường như là một segfault từ invoke.hpp, trong hàm này:

template <class RC, class F BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class AC)> 
inline PyObject* invoke(invoke_tag_<false,false>, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac)) 
{ 
    return rc(f(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac,() BOOST_PP_INTERCEPT))); 
} 
+0

Mã ban đầu hoạt động cho tôi. Có thể đáng để xác minh rằng Boost.Python và 'myModule' đang được xây dựng dựa trên cùng một phiên bản Python và sử dụng cùng cấu hình Boost.Python. Ngoài ra, xác minh rằng 'myModule' liên kết với phiên bản Boost.Python mà từ đó nó được xây dựng dựa trên. –

+0

Tôi nghĩ mọi thứ đều sử dụng các thư viện Python nhất quán. Tôi đã kiểm tra với Dependency Walker nhưng tôi có thể đã bỏ lỡ điều gì đó. Tôi đang sử dụng Python 2.7.5 64 bit và biên dịch với Mingw-w64 trên Windows. Tôi đã phải sử dụng gendef và dlltool để tạo libpython27.a từ python27.dll. Có thể có cái gì để làm với điều này? –

Trả lời

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