มีหลายวิธีในการรวมฟังก์ชัน C หรือ C++ ที่มีอยู่ใน Python ในส่วนนี้ เราจะมาดูกันว่าเราจะรวมฟังก์ชัน C/C++ ด้วย SWIG ได้อย่างไร ด้านล่างนี้คือตัวเลือกอื่นๆ ในการห่อฟังก์ชัน c/c++ ใน python
- การห่อด้วยมือ
- การใช้ pyrex เพื่อห่อโค้ด C
- Ctypes
- SIP
- เพิ่มหลาม
SWIG (ตัวสร้างส่วนต่อประสานแบบง่าย) สามารถตัดโค้ด C ด้วยภาษาอื่น ๆ มากมายรวมถึง Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp (CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3 และ โอแคม. Swig ยังรองรับการใช้งาน Scheme ที่แปลและคอมไพล์แล้ว (เช่น Guile, MzScheme, Chicken)
แต่เราจะพูดถึงการใช้งานกับ python ที่นี่เท่านั้น
SWIG ซึ่งโดยพื้นฐานแล้วเป็นภาษามาโครที่เข้าใจโค้ด C จากนั้นจะคายโค้ด wrapper สำหรับภาษาที่คุณเลือก
การติดตั้ง
ฉันใช้ตัวติดตั้ง windows "swigwin-3.0.12" คุณสามารถดาวน์โหลดได้จาก:
https://www.swig.org/download.html
นอกเหนือจากนั้น คุณอาจต้องใช้ “Microsoft Visual Studio 14.0” หรือสูงกว่าเพื่อเรียกใช้โปรแกรม swig ใน windows
เพื่อแสดงการใช้ swig สมมติว่าเรามีฟังก์ชัน c และเราต้องการเพิ่มในภาษาอื่น เช่น Tcl, Perl, Python (ฉันกำลังโต้ตอบกับ python), Java และ C#
ไฟล์ c ของฉันคือ 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); } }
ไฟล์อินเทอร์เฟซ:
ตอนนี้ ถ้าคุณต้องการเพิ่มไฟล์ c ของคุณเป็นภาษาที่คุณต้องการ คุณต้องเขียน "ไฟล์อินเทอร์เฟซ" ซึ่งเป็นอินพุตของ SWIG ไฟล์อินเทอร์เฟซของฉันสำหรับ example.c คือ
ตัวอย่าง.i
/* File: example.i */ %module example %{ #define SWIG_FILE_WITH_INIT #include "example.h" %} %include "example.h"
ไฟล์ส่วนหัว
เราได้รวมไฟล์ส่วนหัวของไฟล์ตัวอย่างก่อนหน้านี้ นี่คือไฟล์ส่วนหัวของฉัน:
ตัวอย่าง.h
int fact(int n);
ไฟล์การติดตั้ง:
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"], )
การสร้างเสื้อคลุม
ตอนนี้เรากำลังจะสร้าง python wrapper โดยใช้ไฟล์อินเตอร์เฟสของเรา (example.i) หากต้องการสร้าง wrapper สำหรับฟังก์ชันของคุณ เพียงเรียกใช้คำสั่งด้านล่างกับ CLI ของคุณ
>swig -python example.i
ตอนนี้ ถ้าคุณเห็นไดเร็กทอรีการทำงานปัจจุบันของคุณ ไฟล์ใหม่จะถูกสร้างขึ้นในตอนนี้ หากคุณใช้ชื่อไฟล์ด้านบนเป็นของฉัน ไฟล์ wrapper ของคุณจะเป็น "example_wrap.c" มิฉะนั้นไฟล์ wrapper จะมีชื่อว่า
“Your_File_Name” + “_wrapper” + “Your_language_extension”
ดังนั้น หากไฟล์ตัวอย่างของคุณคือ test.c ไฟล์ wrapper ของคุณจะเป็น “test_wrapper.c”
สร้างส่วนขยาย
>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 ….
เท่านี้เราก็สามารถห่อภาษา c ของเราเป็นภาษาไพ ธ อนได้แล้ว หากต้องการตรวจสอบ คุณสามารถเรียกใช้โดยตรงหรือสร้างสภาพแวดล้อมเสมือนและเรียกใช้แยกกัน
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
เพียงเท่านี้ จากฟังก์ชันนำเข้าไฟล์ของคุณแล้วเรียกใช้ได้เลย
>>> from example import fact >>> fact(6) 720