Hướng dẫn sử dụng Python cho biết bạn có thể tạo các mô-đun cho Python trong cả C và C++. Bạn có thể tận dụng những thứ như lớp và mẫu khi sử dụng C++ không? Nó sẽ không tạo ra sự không tương thích với các thư viện còn lại và với thông dịch viên?Tôi có thể sử dụng các tính năng C++ trong khi mở rộng Python không?
Trả lời
Việc bạn triển khai các hàm móc được thực thi bằng C hay trong C++ cũng không quan trọng. Trong thực tế, tôi đã nhìn thấy một số phần mở rộng Python mà làm cho hoạt động sử dụng các mẫu C++ và thậm chí cả thư viện Boost. Không sao cả. :-)
Điều bạn quan tâm là một chương trình có tên SWIG. Nó sẽ tạo ra các trình bao bọc và giao diện Python cho mã C++. Tôi sử dụng nó với các mẫu, kế thừa, không gian tên, vv và nó hoạt động tốt.
Nếu bạn chủ yếu nhắm mục tiêu C++, SWIG chắc chắn không phải là công cụ bạn muốn sử dụng. Thật tiện lợi khi nó hiểu C++ đủ tốt để bọc nó nếu nó là một phần nhỏ của những gì bạn đang làm việc, nhưng nó không thể chạm vào hỗ trợ Boost.Python for C++. –
@Nick: Tôi đã xem thư viện Boost :: Python và tôi không tin rằng nó vượt trội. Tất cả ma thuật tạo khuôn mẫu và macro mà Boost sử dụng có thể mong manh, và nó giới hạn những gì có thể được thực hiện với mã. –
Tại sao lại là downvote? Đây là câu trả lời hữu ích hơn câu trả lời "." –
Nhân viên thúc đẩy có cách tự động tốt đẹp để thực hiện việc gói mã C++ để sử dụng bởi python.
Nó được gọi là: Boost.Python
Nó đề cập đến một số các cấu trúc của C++ tốt hơn so với SWIG, đặc biệt là mẫu Lập trình meta.
Bạn sẽ có thể sử dụng tất cả các tính năng của ngôn ngữ C++. Các Extending Python Documentation (2.6.2) nói rằng bạn có thể sử dụng C++, nhưng đề cập đến các nội dung sau hãy cẩn thận:
Có thể viết phần mở rộng module trong C++. Một số hạn chế áp dụng. Nếu chương trình chính (trình thông dịch Python ) được biên dịch và liên kết bởi trình biên dịch C, toàn cầu hoặc tĩnh đối tượng có các hàm tạo không được sử dụng . Đây không phải là vấn đề nếu chương trình chính được liên kết bởi trình biên dịch C++ . Các hàm sẽ là được trình thông dịch Python gọi (trong số cụ thể, khởi tạo mô-đun chức năng) phải được khai báo bằng cách sử dụng extern "C". Không cần thiết phải đính kèm các tệp tiêu đề Python trong bên ngoài "C" {...} - chúng sử dụng biểu mẫu này nếu biểu tượng __cplusplus là được xác định (tất cả các trình biên dịch C++ gần đây xác định biểu tượng này).
Hạn chế đầu tiên, "đối tượng chung hoặc tĩnh với hàm tạo không thể được sử dụng", phải làm theo cách trình biên dịch C++ khởi tạo đối tượng với loại thời lượng lưu trữ này. Ví dụ: hãy xem xét mã sau:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
Trình biên dịch phải phát ra mã đặc biệt để hàm tạo 'Foo' được gọi cho 'f' trước khi thực thi chính. Nếu bạn có các đối tượng có thời gian lưu trữ tĩnh trong phần mở rộng Python của bạn và trình thông dịch Python không được biên dịch và liên kết với C++, thì mã khởi tạo đặc biệt này sẽ không được tạo ra.
Hạn chế thứ hai, "Các hàm sẽ được gọi bởi trình thông dịch Python (đặc biệt, các hàm khởi tạo mô-đun) phải được khai báo bằng cách sử dụng" C "bên ngoài, phải làm với tên mang tên C++. Hầu hết các trình biên dịch C++ đều mang tên của chúng để chúng có thể sử dụng cùng một trình liên kết được cung cấp cho các công cụ C.Ví dụ nói rằng bạn có:
void a_function_python_calls(void* foo);
C++ biên dịch có thể chuyển đổi tài liệu tham khảo để tên 'a_function_python_calls' một cái gì đó như 'a_function_python_calls @ 1vga'. Trong trường hợp đó bạn có thể nhận được một bên ngoài chưa được giải quyết khi cố gắng liên kết với thư viện Python.
Tất nhiên, những vấn đề này phù hợp với bất kỳ liên kết C đến C++, và không phải duy nhất để Python. Nếu bạn kiểm soát quá trình xây dựng của trình thông dịch Python (ví dụ bạn đang nhúng và mở rộng, không chỉ mở rộng), thì bạn không cần phải lo lắng về điều này, vì bạn có thể xây dựng Python bằng trình biên dịch và trình liên kết C++. –
Hãy xem câu trả lời cho http://stackoverflow.com/q/10368141/151641 – mloskot