Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Gói C/C++ cho Python dùng SWIG


Có nhiều cách gói chức năng C/C++ hiện có cho Python. Phần này xem cách gói C/C++ với SWIG. Các lựa chọn khác:

  • Gói thủ công
  • Dùng pyrex gói mã C
  • Ctypes
  • SIP
  • Boost Python

SWIG (Simple Wrapper Interface Generator) gói mã C với nhiều ngôn ngữ: Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp, Java, Modula-3, OCAML, và các triển khai Scheme (Guile, MzScheme, Chicken).

Chỉ thảo luận triển khai với Python ở đây.

SWIG về cơ bản là ngôn ngữ macro hiểu mã C và sinh mã wrapper cho ngôn ngữ mục tiêu.

Cài đặt

Dùng "swigwin-3.0.12" bộ cài SWIG Windows, tải tại:

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

Cần "Microsoft Visual Studio 14.0" hoặc mới hơn để chạy SWIG trên Windows.

Để minh họa, giả sử có hàm C và muốn thêm vào Tcl, Perl, Python, Java, C#.

File C: example.c

#include "example.h"
int fact(int n) {
    if (n < 0) {
        return 0;
    }
    if (n == 0) {
        return 1;
    } else {
        return n * fact(n-1);
    }
}

File giao diện (Interface file)

Để thêm file C vào ngôn ngữ ưa thích, viết "interface file" làm đầu vào SWIG. File interface cho example.c:

example.i

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

File header

Đã include header trong example.c. Đây là header:

example.h

int fact(int n);

File setup

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 wrapper

Tạo wrapper Python dùng file interface (example.i). Chạy lệnh CLI:

>swig -python example.i

File mới tạo: "example_wrap.c" (hoặc "Your_File_Name_wrapper_Your_language_extension").

Build extension

>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
...

Xong, có thể gói C cho Python. Test bằng virtual environment:

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

Import hàm và chạy:

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