Computer >> Máy Tính >  >> Lập trình >> lập trình C

Gói C / C ++ cho Python bằng SWIG

Có nhiều cách để gói chức năng C hoặc C ++ hiện có của bạn trong Python. Trong phần này, chúng ta sẽ xem cách chúng ta có thể kết hợp chức năng C / C ++ với SWIG. Dưới đây là các tùy chọn khác để gói chức năng c / c ++ trong python.

  • Gói thủ công
  • Sử dụng pyrex để bọc mã C.
  • Ctypes
  • SIP
  • Tăng cường Python

SWIG (Trình tạo giao diện gói đơn giản) có khả năng gói mã C với nhiều ngôn ngữ khác bao gồm Perl, Python, PHP, Ruby, Tcl, C #, Common Lisp (CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3 và OCAML. Swig cũng hỗ trợ nhiều triển khai Đề án được thông dịch và biên dịch (như Guile, MzScheme, Chicken) được hỗ trợ.

Nhưng chúng ta sẽ chỉ thảo luận về việc triển khai nó với python tại đây.

SWIG về cơ bản là một ngôn ngữ macro hiểu được mã C và sau đó sẽ tạo ra mã trình bao bọc cho ngôn ngữ bạn chọn.

Cài đặt

Tôi đang sử dụng trình cài đặt windows swig “swigwin-3.0.12”, bạn có thể tải xuống từ:

https://www.swig.org/download.html

Ngoài ra, bạn có thể cần “Microsoft Visual Studio 14.0” trở lên để chạy chương trình swig trong windows.

Để minh họa việc sử dụng swig, giả sử chúng ta có một số hàm c và chúng ta muốn thêm nó vào các ngôn ngữ khác như Tcl, Perl, Python (tôi đang tương tác với python), Java và C #.

Tệp c của tôi là example.c

#include "example.h"
int fact(int n) {
   if (n < 0) {       /* This should probably return an error, but this is simpler */
      return 0;
   }
   if (n == 0) {
      return 1;
   } else {
      /* testing for overflow would be a good idea here */
      return n * fact(n-1);
   }
}

Tệp giao diện:

Bây giờ, nếu bạn muốn thêm tệp c của mình vào ngôn ngữ ưa thích của mình, bạn cần viết một “tệp giao diện” là đầu vào cho SWIG. Tệp giao diện của tôi cho example.c là,

example.i

/* File: example.i */
%module example
%{
   #define SWIG_FILE_WITH_INIT
   #include "example.h"
%}
%include "example.h"

Tệp tiêu đề

Chúng tôi đã bao gồm tệp tiêu đề tệp ví dụ trước đó của chúng tôi. Đây là tệp tiêu đề của tôi:

example.h

int fact(int n);

Tệp thiết lập:

from distutils.core import setup, Extension
example_module = Extension('_example',
   sources=['example_wrap.c', 'example.c'],
)
setup (name = 'example',
   version = '0.1',
   author = "SWIG Docs",
   description = """Simple swig example from docs""",
   ext_modules = [example_module],
   py_modules = ["example"],
)

Tạo trình bao bọc

Bây giờ chúng ta sẽ tạo trình bao bọc python bằng tệp giao diện của chúng ta (example.i). Để tạo trình bao bọc cho hàm của bạn, chỉ cần chạy lệnh dưới đây trên CLI của bạn.

>swig -python example.i

Bây giờ nếu bạn nhìn thấy thư mục làm việc hiện tại của mình, một tệp mới đã được tạo ngay bây giờ. Nếu bạn đang sử dụng tên tệp ở trên là của tôi, thì tệp trình bao bọc của bạn sẽ là “example_wrap.c”. Còn tệp trình bao bọc sẽ có tên giống như

“Your_File_Name” + “_wrapper” + “Your_language_extension”

Vì vậy, nếu tệp mẫu của bạn là test.c thì tệp trình bao bọc của bạn sẽ là “test_wrapper.c”.

Đã xây dựng phần mở rộng

>python setup.py build_ext
running build_ext
building '_example' extension
creating build
creating build\temp.win32-3.6
creating build\temp.win32-3.6\Release
….

Đó là bây giờ chúng tôi có thể chuyển ngôn ngữ c của mình thành ngôn ngữ python. Để kiểm tra, bạn có thể chạy trực tiếp hoặc tạo môi trường ảo và chạy riêng.

C:\Users\rajesh>mkdir swigExample && cd swigExample
C:\Users\rajesh\swigExample>virtualenv swigenv
Using base prefix 'c:\\python\\python361'
New python executable in C:\Users\rajesh\swigExample\swigenv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

C:\Users\rajesh\swigExample>.\swigenv\Scripts\activate

(swigenv) C:\Users\rajesh\swigExample>python

Vậy là xong, bây giờ từ chức năng nhập tệp của bạn và chạy nó.

>>> from example import fact
>>> fact(6)
720