2009-03-02 33 views
30

Tôi đã triển khai một lớp bằng C++. Tôi muốn sử dụng nó với Python. Vui lòng đề xuất phương pháp từng bước và xây dựng từng bước. somthing như thế này ...Tôi có thể sử dụng lớp C++ bằng Python như thế nào?

class Test{ 
    private: 
     int n; 
    public: 
     Test(int k){ 
      n=k; 
     } 
     void setInt(int k){ 
      n = k; 
     } 
     int getInt(){ 
      return n; 
     } 
}; 

Bây giờ, trong Python

>>> T1 = Test(12) 
>>> T1.getInt() 
12 
>>> T1.setInt(32) 
>>> T1.getInt() 
32 

Hãy suggest.How tôi có thể làm điều này? LƯU Ý: Tôi muốn biết cách thủ công để thực hiện điều đó. Tôi không muốn bất kỳ sự phụ thuộc thư viện của bên thứ ba nào.

+1

Chỉ tò mò - tại sao bạn muốn tránh các bên thứ 3? –

Trả lời

23

Nhìn vào Boost.Python. Đó là một thư viện để viết các mô-đun python với C++.

Đồng thời xem xét SWIG cũng có thể xử lý các mô-đun cho các ngôn ngữ kịch bản khác. Tôi đã sử dụng nó trong quá khứ để viết mô-đun cho lớp của tôi và sử dụng chúng trong python. Hoạt động tuyệt vời.

Bạn có thể thực hiện thủ công bằng cách sử dụng Python/C API, tự viết giao diện. Nó khá lowlevel, nhưng bạn sẽ thu được rất nhiều kiến ​​thức bổ sung về cách Python làm việc phía sau scene (Và bạn sẽ cần nó khi bạn sử dụng SWIG anyway).

+12

Không đáp ứng yêu cầu "Tôi không muốn bất kỳ phụ thuộc thư viện của bên thứ ba" nào. – Constantin

+2

Bạn sẽ cần thư viện python. nó bao gồm python/c api tất nhiên. –

9

ctypes là tốt. Nó thực sự dễ sử dụng và nó có tiêu chuẩn với Python. Thật không may nó chỉ có thể nói chuyện với các thư viện chia sẻ (Unix) hoặc DLL (Windows) có giao diện kiểu C, có nghĩa là bạn không thể trực tiếp giao diện với một đối tượng C++. Nhưng bạn có thể sử dụng một hệ thống xử lý, nơi một xử lý đề cập đến một đối tượng cụ thể.

>>> getInt(h) 
12 

Tôi nghĩ điều đó đơn giản, dễ hiểu và không yêu cầu thêm thư viện.

+1

Bạn có thể giải thích rõ ràng về ý nghĩa của nó, "bạn không thể nói chuyện với các thư viện chia sẻ hoặc các tệp DLL, có nghĩa là bạn không thể trực tiếp giao diện với đối tượng C++"? Điều gì sẽ thay đổi hành vi khôn ngoan khi sử dụng các đối tượng C++ trong Python? Nó có tác động đáng chú ý không? Tôi cần phải cuối cùng viết một ràng buộc với C + + API của tôi trong Python, Cảm ơn trước cho bất kỳ sự giúp đỡ. –

+3

@ 2g7hgfdr8324, bạn đã đánh giá sai tôi. Tôi đã không nói "bạn không thể nói chuyện với thư viện được chia sẻ hoặc DLL". Tôi nói ngược lại. Có, nếu bạn có thể tiếp xúc với C++ API của bạn như là một DLL, sau đó bạn có thể gọi nó từ Python thông qua ctypes. Giao diện của bạn sẽ phải mặc định là C, chứ không phải C++. –

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