2010-12-14 24 views
6

Giả sử tôi có hai mô đun python tăng cường được định nghĩa như sau. Mô-đun A:Phụ thuộc mô-đun chéo trong Tăng cường Python

class SomeClass { 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
}; 
BOOST_PYTHON_MODULE(A) 
{ 
    class_<SomeClass>("SomeClass"); 
} 

Và mô-đun B:

class AnotherClass { 
public: 
    AnotherClass() {} 
    ~AnotherClass() {} 
    void func(SomeClass& sp) {} 
}; 
BOOST_PYTHON_MODULE(B) 
{ class_<AnotherClass>("AnotherClass") 
     .def("func", &AnotherClass::func) 
    ; 
} 

mô-đun B có một sự phụ thuộc vào mô-đun A (ví dụ: nó sử dụng SomeClass từ module A). Bây giờ, tôi thực thi kịch bản python sau:

import A 
import B 
obj1 = A.SomeClass() 
obj2 = B.AnotherClass() 
obj2.func(obj1) 

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

Traceback (most recent call last): 
    File "C:\bladiebla\script.py", line 8, in <module> 
    obj2.func(obj1) 
ArgumentError: Python argument types in 
AnotherClass.func(AnotherClass, SomeClass) 
did not match C++ signature: 
func(class AnotherClass {lvalue}, class SomeClass) 

Dường như Python không tự động dịch các lớp học giữa các module. Có ai có một ý tưởng làm thế nào để giải quyết điều này?

Trả lời

0

Dựa trên phản hồi mới nhất và thông báo lỗi cập nhật trong câu hỏi của bạn, tôi nghĩ rằng sự cố có thể là do sử dụng BOOST_PYTHON_MODULE của bạn có thể không chính xác (dựa trên những gì tôi đã thấy trong các ví dụ khác khi sử dụng). Hãy thử một cái gì đó như thế này và xem nếu nó giúp:

Mô-đun A:

class SomeClass { 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
}; 
BOOST_PYTHON_MODULE(A) 
{ 
    boost::python::class_<SomeClass>("SomeClass"); 
} 

Và mô-đun B:

class AnotherClass { 
public: 
    AnotherClass() {} 
    ~AnotherClass() {} 
    void func(SomeClass& sp) {} 
}; 
BOOST_PYTHON_MODULE(B) 
{ boost::python::class_<AnotherClass>("AnotherClass") 
     .def("func", &AnotherClass::func) 
    ; 
} 

Lưu ý chèn của một "boost::python::" tiền tố vào class_<...> tuyên bố trong mỗi của hai tờ khai BOOST_PYTHON_MODULE.

+0

Xin chào, cảm ơn rất nhiều vì phản hồi của bạn. Tuy nhiên, tôi muốn giải quyết vấn đề này cho hai lớp không có mối quan hệ thừa kế. Ví dụ, bạn có thể tưởng tượng rằng 'SomeClass' thực tế là một lớp 'Tam giác' và 'AnotherClass' là lớp 'Đa giác'. Tôi chắc chắn không muốn Polygon kế thừa từ Tam giác, bởi vì nó không có ý nghĩa từ quan điểm của OO. Vì vậy, làm thế nào tôi có thể có hai lớp học trong các mô-đun khác nhau mà không kế thừa từ mỗi khác, nhưng mà sử dụng lẫn nhau thông qua Python, như trong ví dụ ban đầu của tôi? – Arjan

+0

'func()' muốn một đối số 'SomeClass'. Nếu bạn muốn chuyển nó một cái gì đó khác, như 'AnotherClass', bạn có thể làm như vậy ** mà không ** tạo' AnotherClass' kế thừa từ 'SomeClass' bằng cách thêm một hàm tạo vào' SomeClass' để nhận một đối số 'AnotherClass'. Hoặc bạn chỉ có thể viết một cái gì đó chấp nhận một đối số 'AnotherClass' và trả về một thể hiện' SomeClass', nhưng sẽ phải gọi nó một cách rõ ràng.Nếu bạn không thể làm điều gì đó như thế thì tôi nghĩ bạn bị mắc kẹt - cái gì 'func()' phải làm gì, nếu vượt qua một lớp tùy ý thì nó chẳng biết gì về nó? – martineau

+0

Vâng, tôi hiểu điều đó, nhưng tôi không muốn vượt qua bất cứ điều gì khác với chức năng này, chỉ là một đối số của loại SomeClass. Trong ví dụ kịch bản python, obj1 của tôi thuộc kiểu A.SomeClass. Nó không liên quan đến B.AnotherClass. 'func' trong B.AnotherClass nên chấp nhận các tham số thuộc loại A.SomeClass, chẳng hạn như obj1. – Arjan

6

Tôi vừa mới bắt đầu sử dụng Boost.Python và gặp vấn đề tương tự.

Check-out phần 6 của doc sau:

http://www.boost.org/doc/libs/1_47_0/libs/python/doc/building.html

6,1 - Các động Binary

Thư viện chứa một registry loại chuyển đổi. Vì một sổ đăng ký được chia sẻ giữa tất cả các mô-đun mở rộng, các cá thể của một lớp được tiếp xúc với Python trong một mô-đun mở rộng được nạp động có thể được chuyển tới các hàm được hiển thị trong một mô-đun khác.

Tôi đã sử dụng nhị phân tĩnh và có cùng loại lỗi bạn nhận được. Khi tôi thay đổi thành nhị phân động, nó được biên dịch và chạy tốt.

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