आपके मौजूदा C या C++ कार्यक्षमता को Python में रैप करने के कई तरीके हैं। इस सेक्शन में, हम देखेंगे कि हम SWIG के साथ C/C++ कार्यक्षमता को कैसे रैप कर सकते हैं। Python में c/c++ कार्यक्षमता रैप करने के अन्य विकल्प नीचे दिए गए हैं।
- मैन्युअल रैपिंग
- C कोड रैप करने के लिए pyrex का उपयोग
- Ctypes
- SIP
- Boost Python
SWIG (Simple Wrapper Interface Generator) C कोड को Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp (CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3 और OCAML सहित कई अन्य भाषाओं के साथ रैप करने में सक्षम है। Swig कई इंटरप्रेटेड और कंपाइल्ड Scheme इम्प्लीमेंटेशन्स (जैसे Guile, MzScheme, Chicken) का भी समर्थन करता है।
लेकिन हम यहां केवल Python के साथ इसके कार्यान्वयन पर चर्चा करेंगे।
SWIG मूल रूप से एक मैक्रो भाषा है जो C कोड को समझती है और फिर आपकी पसंद की भाषा के लिए रैपर कोड निकाल देती है।
इंस्टॉलेशन
मैं "swigwin-3.0.12" Windows SWIG इंस्टॉलर का उपयोग कर रहा हूं, आप इसे यहां से डाउनलोड कर सकते हैं:
https://www.swig.org/download.html
इसके अलावा आपको Windows में SWIG प्रोग्राम चलाने के लिए "Microsoft Visual Studio 14.0" या उच्चतर की आवश्यकता हो सकती है।
SWIG के उपयोग को स्पष्ट करने के लिए, मान लीजिए हमारे पास कुछ C फंक्शन हैं और हम इसे Tcl, Perl, Python (मैं Python के साथ इंटरैक्ट कर रहा हूं), Java और C# जैसी अन्य भाषाओं में जोड़ना चाहते हैं।
मेरी 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);
}
}
इंटरफेस फाइल:
अब, यदि आप अपनी C फाइल को अपनी पसंदीदा भाषा में जोड़ना चाहते हैं, तो आपको एक "इंटरफेस फाइल" लिखनी होगी जो SWIG का इनपुट है। example.c के लिए मेरी इंटरफेस फाइल है,
example.i
/* File: example.i */
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
%include "example.h"
हेडर फाइल
हमने अपने पिछले उदाहरण फाइल में हेडर फाइल शामिल की है। तो यहां मेरी हेडर फाइल है:
example.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"],
)
रैपर बनाना
अब हम अपनी इंटरफेस फाइल (example.i) का उपयोग करके Python रैपर बनाने जा रहे हैं। अपने फंक्शन के लिए रैपर बनाने के लिए, बस अपने CLI पर नीचे दी गई कमांड चलाएं।
>swig -python example.i
अब यदि आप अपनी वर्तमान वर्किंग डायरेक्टरी देखते हैं, तो एक नई फाइल अभी बनाई गई है। यदि आप मेरे जैसे उपरोक्त फाइलनाम का उपयोग कर रहे हैं, तो आपकी रैपर फाइल "example_wrap.c" होगी अन्यथा रैपर फाइल का नाम कुछ इस तरह होगा
"Your_File_Name" + "_wrapper" + "Your_language_extension"
इसलिए यदि आपकी उदाहरण फाइल test.c है तो आपकी रैपर फाइल "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 भाषा को Python भाषा में रैप करने में सक्षम हैं। इसे जांचने के लिए आप सीधे चला सकते हैं या एक वर्चुअल एनवायरनमेंट बना सकते हैं और अलग से चला सकते हैं।
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