Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การห่อ C/C++ สำหรับ Python โดยใช้ SWIG


มีหลายวิธีในการรวมฟังก์ชัน 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