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