Hướng dẫn can we use c++ and python together? - chúng ta có thể sử dụng c ++ và python cùng nhau không?
Show
Python và C, hai trong số những ngôn ngữ phổ biến và lớn nhất đã ra khỏi lập trình. Nhiều ngôn ngữ có thể giao tiếp với nhau rất dễ dàng, nhưng với Python và C thì hơi khó khăn. Nhưng trước tiên hãy bắt đầu với lý do tại sao chúng ta muốn điều này? Không có nghi ngờ gì về điều đó rằng cả hai ngôn ngữ này đều mạnh mẽ và vô cùng hữu ích. Và đôi khi nó được đền đáp để có hiệu suất thô của ngôn ngữ C đang được sử dụng trong dự án Python, nó chắc chắn có thể giúp các thủ tục như giảm thời gian phản hồi và xử lý. Những gì chúng ta sẽ cầnPython và C. Đó là nó. Mật mãTrong ví dụ này, tôi sẽ sử dụng chức năng Fibonacci đơn giản để chứng minh tất cả.
Nhập chế độ FullScreenen EXIT Mode FullScreen Trong mã, chúng ta có thể thấy rằng chúng ta yêu cầu tệp tiêu đề 4, điều này chứa tất cả các phương thức, hàm, thuộc tính có liên quan, v.v. Chúng ta cần cho phép hai ngôn ngữ hoạt động cùng nhau. Trước tiên, chúng tôi bắt đầu bằng cách tạo chức năng bình thường trong C, sau đó sử dụng các phương thức từ tệp tiêu đề Python, chúng tôi tạo lại nó, nhưng với một vài đối số nữa.Như bạn có thể thấy chúng tôi đang sử dụng các nhà xây dựng và trình phân tích cú pháp bên trong chức năng. Chúng giao tiếp giữa cả hai ngôn ngữ để tạo các phiên bản Python của (các) hàm trong C. Ngoài ra, chúng tôi cần một tập lệnh thiết lập nhỏ được viết bằng Python
Nhập chế độ FullScreenen EXIT Mode FullScreen Trong mã, chúng ta có thể thấy rằng chúng ta yêu cầu tệp tiêu đề 4, điều này chứa tất cả các phương thức, hàm, thuộc tính có liên quan, v.v. Chúng ta cần cho phép hai ngôn ngữ hoạt động cùng nhau. Trước tiên, chúng tôi bắt đầu bằng cách tạo chức năng bình thường trong C, sau đó sử dụng các phương thức từ tệp tiêu đề Python, chúng tôi tạo lại nó, nhưng với một vài đối số nữa.Như bạn có thể thấy chúng tôi đang sử dụng các nhà xây dựng và trình phân tích cú pháp bên trong chức năng. Chúng giao tiếp giữa cả hai ngôn ngữ để tạo các phiên bản Python của (các) hàm trong C. 5 6 this will then allow you to call your module from any other python project. Ngoài ra, chúng tôi cần một tập lệnh thiết lập nhỏ được viết bằng Python
Nhập chế độ FullScreenen EXIT Mode FullScreen Trong mã, chúng ta có thể thấy rằng chúng ta yêu cầu tệp tiêu đề 4, điều này chứa tất cả các phương thức, hàm, thuộc tính có liên quan, v.v. Chúng ta cần cho phép hai ngôn ngữ hoạt động cùng nhau. Trước tiên, chúng tôi bắt đầu bằng cách tạo chức năng bình thường trong C, sau đó sử dụng các phương thức từ tệp tiêu đề Python, chúng tôi tạo lại nó, nhưng với một vài đối số nữa.Như bạn có thể thấy chúng tôi đang sử dụng các nhà xây dựng và trình phân tích cú pháp bên trong chức năng. Chúng giao tiếp giữa cả hai ngôn ngữ để tạo các phiên bản Python của (các) hàm trong C. Ngoài ra, chúng tôi cần một tập lệnh thiết lập nhỏ được viết bằng Python Chuỗi C-Wide, null kết thúc thành Python Unicode hoặc null thành không. u#.so (for shared object). On Windows machines, you typically see .dll (for dynamically linked library). Py_unicode*+intChuỗi rộng C và chiều dài thành Python Unicode, hoặc NULL thành không.
z Giống như S, cũng không chấp nhận không (đặt c char* thành null).z#
[...]Xây dựng danh sách Python từ các giá trị C. {...} Xây dựng từ điển Python từ các giá trị C, các khóa và giá trị xen kẽ.Mã {...} xây dựng từ điển từ số lượng giá trị C chẵn, các khóa và giá trị xen kẽ. Ví dụ: py_buildvalue ("{Issi}", 23, "zig", "zag", 42) trả về một từ điển như Python's {23: 'zig', 'zag': 42}. Bất kỳ mã nào bạn viết bằng bất kỳ ngôn ngữ được biên dịch nào như C, C ++ hoặc Java có thể được tích hợp hoặc nhập vào một tập lệnh Python khác. Mã này được coi là một "phần mở rộng".Một mô -đun mở rộng Python không gì khác hơn là một thư viện C bình thường. Trên các máy Unix, các thư viện này thường kết thúc bằng .so (đối với đối tượng được chia sẻ). Trên máy Windows, bạn thường thấy .dll (cho thư viện được liên kết động).None value. The Python headers define a macro, Py_RETURN_NONE, that does this for us. Điều kiện tiên quyết để viết phần mở rộng Để bắt đầu viết tiện ích mở rộng của mình, bạn sẽ cần các tệp tiêu đề Python. static PyObject *module_func(PyObject *self, PyObject *args) { /* Do your stuff here. */ Py_RETURN_NONE; } Trên các máy Unix, điều này thường yêu cầu cài đặt gói dành riêng cho nhà phát triển như Python2.5-DEV. Người dùng Windows nhận được các tiêu đề này như là một phần của gói khi họ sử dụng trình cài đặt Python nhị phân.Ngoài ra, người ta cho rằng bạn có kiến thức tốt về C hoặc C ++ để viết bất kỳ tiện ích mở rộng Python nào bằng lập trình C. struct PyMethodDef { char *ml_name; PyCFunction ml_meth; int ml_flags; char *ml_doc; }; Đầu tiên nhìn vào một phần mở rộng Python
Bảng này cần phải được chấm dứt với một sentinel bao gồm các giá trị null và 0 cho các thành viên thích hợp. Thí dụĐối với hàm được xác định ở trên, chúng tôi có bảng ánh xạ phương thức sau- static PyMethodDef module_methods[] = { { "func", (PyCFunction)module_func, METH_NOARGS, NULL }, { NULL, NULL, 0, NULL } }; Hàm khởi tạoPhần cuối cùng của mô -đun mở rộng của bạn là chức năng khởi tạo. Hàm này được gọi bởi trình thông dịch Python khi mô -đun được tải. Cần có chức năng được đặt tên là initModule, trong đó mô -đun là tên của mô -đun.initModule, where Module is the name of the module. Chức năng khởi tạo cần được xuất từ thư viện bạn sẽ xây dựng. Các tiêu đề Python xác định pymodinit_func để bao gồm các câu thần chú thích hợp để điều đó xảy ra cho môi trường cụ thể mà chúng ta đang biên dịch. Tất cả bạn phải làm là sử dụng nó khi xác định chức năng. Hàm khởi tạo C của bạn thường có cấu trúc tổng thể sau - PyMODINIT_FUNC initModule() { Py_InitModule3(func, module_methods, "docstring..."); } Đây là mô tả về hàm py_initmodule3 -
Đặt tất cả những điều này lại với nhau trông giống như sau - #include Thí dụMột ví dụ đơn giản sử dụng tất cả các khái niệm trên - #include Ở đây, hàm Py_BuildValue được sử dụng để xây dựng giá trị Python. Lưu mã trên trong tệp Hello.c. Chúng ta sẽ thấy cách biên dịch và cài đặt mô -đun này để được gọi từ tập lệnh Python. Xây dựng và cài đặt các tiện ích mở rộngGói Distutils làm cho nó rất dễ dàng để phân phối các mô -đun Python, cả các mô -đun Python và Mở rộng thuần túy, theo một cách tiêu chuẩn. Các mô -đun được phân phối ở dạng nguồn và được xây dựng và cài đặt thông qua tập lệnh thiết lập thường được gọi là setup.py như sau. Đối với mô -đun ở trên, bạn cần chuẩn bị script setup.py sau - 0Bây giờ, hãy sử dụng lệnh sau, sẽ thực hiện tất cả các bước biên dịch và liên kết cần thiết, với các lệnh và cờ trình liên kết đúng và cờ, và sao chép thư viện động kết quả thành một thư mục thích hợp - 1Trên các hệ thống dựa trên UNIX, rất có thể bạn sẽ cần chạy lệnh này dưới dạng root để có quyền ghi vào thư mục gói trang web. Đây thường không phải là một vấn đề trên Windows. Nhập tiện ích mở rộngKhi bạn đã cài đặt tiện ích mở rộng của mình, bạn sẽ có thể nhập và gọi tiện ích mở rộng đó trong tập lệnh Python của bạn như sau - 2Điều này sẽ tạo ra kết quả sau - 3Chuyển các tham số chức năngVì rất có thể bạn sẽ muốn xác định các chức năng chấp nhận các đối số, bạn có thể sử dụng một trong các chữ ký khác cho các chức năng C. Ví dụ: chức năng sau, chấp nhận một số tham số, sẽ được xác định như thế này - 4Bảng phương thức chứa một mục cho chức năng mới sẽ trông giống như thế này - 5Bạn có thể sử dụng chức năng API Pyarg_ParSetuple để trích xuất các đối số từ một con trỏ PyObject được truyền vào hàm C. Đối số đầu tiên cho pyarg_parsetuple là đối số Args. Đây là đối tượng bạn sẽ phân tích cú pháp. Đối số thứ hai là một chuỗi định dạng mô tả các đối số khi bạn mong đợi chúng xuất hiện. Mỗi đối số được biểu diễn bởi một hoặc nhiều ký tự trong chuỗi định dạng như sau. 6Biên dịch phiên bản mới của mô -đun của bạn và nhập nó cho phép bạn gọi chức năng mới với bất kỳ số lượng đối số nào thuộc bất kỳ loại - 7Bạn có thể có thể đưa ra nhiều biến thể hơn nữa. Hàm pyarg_parsetupleDưới đây là chữ ký tiêu chuẩn cho hàm pyarg_parsetuple -PyArg_ParseTuple function − 8Hàm này trả về 0 cho các lỗi và giá trị không bằng 0 cho thành công. Tuple là pyobject* đó là đối số thứ hai của hàm C. Ở đây định dạng là một chuỗi C mô tả các đối số bắt buộc và tùy chọn. Dưới đây là danh sách các mã định dạng cho chức năng pyarg_parsetuple -PyArg_ParseTuple function −
:Định dạng kết thúc, theo sau là tên chức năng cho thông báo lỗi. 9; 0Định dạng kết thúc, theo sau là toàn bộ văn bản thông báo lỗi. 1; 2Định dạng kết thúc, theo sau là toàn bộ văn bản thông báo lỗi.Trả lại giá trịPy_BuildValue function − 3Py_BuildValue có một chuỗi định dạng giống như pyarg_parsetuple. Thay vì chuyển các địa chỉ của các giá trị bạn đang xây dựng, bạn vượt qua các giá trị thực tế. Dưới đây là một ví dụ cho thấy cách thực hiện chức năng Thêm - Đây là những gì nó sẽ trông như thế nào nếu được thực hiện trong Python -
char* |