কম্পিউটার টিউটোরিয়াল

SWIG ব্যবহার করে সি/সি++ পাইথনের জন্য র‍্যাপ (Wrapping) করা


আপনার বিদ্যমান সি বা সি++ ফাংশনালিটি পাইথনে র‍্যাপ করার একাধিক পদ্ধতি আছে। এই সেকশনে আমরা দেখব কিভাবে SWIG ব্যবহার করে সি/সি++ ফাংশনালিটি র‍্যাপ করা যায়। নিচে পাইথনে সি/সি++ র‍্যাপ করার অন্যান্য অপশনগুলো দেওয়া হলো:

  • ম্যানুয়াল র‍্যাপিং
  • পাইরেক্স (Pyrex) ব্যবহার করে সি কোড র‍্যাপ করা
  • Ctypes
  • SIP
  • Boost Python

SWIG (Simple Wrapper Interface Generator) সি কোড অনেক ভাষা সহ র‍্যাপ করতে সক্ষম যার মধ্যে রয়েছে Perl, Python, PHP, Ruby, Tcl, C#, Common Lisp (CLISP, Allegro, CL, UFFI, CFFI), Java, Modula-3 এবং OCAML। SWIG একাধিক ইন্টারপ্রেটেড এবং কম্পাইল্ড স্কিম ইমপ্লিমেন্টেশন (Guile, MzScheme, Chicken) সাপোর্ট করে।

এখানে আমরা শুধু পাইথনের সাথে এর ইমপ্লিমেন্টেশন নিয়ে আলোচনা করব।

SWIG মূলত একটি ম্যাক্রো ল্যাঙ্গুয়েজ যা সি কোড বুঝে এবং তারপর আপনার পছন্দের ভাষার জন্য র‍্যাপার কোড জেনারেট করে।

ইনস্টলেশন (Installation)

আমি "swigwin-3.0.12" উইন্ডোজ SWIG ইনস্টলার ব্যবহার করছি, এটি ডাউনলোড করা যাবে:

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

এছাড়াও আপনাকে "Microsoft Visual Studio 14.0" বা উচ্চতর ভার্সন দরকার হতে পারে উইন্ডোজে SWIG প্রোগ্রাম চালাতে।

SWIG-এর ব্যবহার বোঝাতে, ধরা যাক আমাদের কিছু সি ফাংশন আছে এবং আমরা সেগুলো অন্য ভাষা যেমন Tcl, Perl, Python (আমি পাইথনের সাথে ইন্টারঅ্যাক্ট করছি), Java এবং 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);
    }
}

ইন্টারফেস ফাইল (Interface file):

আপনি যদি আপনার সি ফাইলকে পছন্দের ভাষায় যোগ করতে চান, তবে আপনাকে একটি "ইন্টারফেস ফাইল" লিখতে হবে যা SWIG-এর ইনপুট। example.c-এর জন্য আমার ইন্টারফেস ফাইল:

example.i

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

হেডার ফাইল (Header file)

আমরা পূর্বের উদাহরণ ফাইলে হেডার ফাইল ইনক্লুড করেছিলাম। তাই এখানে আমার হেডার ফাইল:

example.h

int fact(int n);

সেটআপ ফাইল (Setup file):

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"],
)

র‍্যাপার তৈরি করা (Creating the wrapper)

এখন আমরা আমাদের ইন্টারফেস ফাইল (example.i) ব্যবহার করে পাইথন র‍্যাপার তৈরি করব। আপনার ফাংশনের জন্য র‍্যাপার তৈরি করতে, নিচের কমান্ডটি আপনার CLI-এ রান করুন।

>swig -python example.i

এখন আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে একটি নতুন ফাইল তৈরি হবে। আপনি যদি উপরের ফাইল নাম ব্যবহার করেন, তবে আপনার র‍্যাপার ফাইল হবে "example_wrap.c" অন্যথায় র‍্যাপার ফাইলটির নাম হবে কিছু такой:

"Your_File_Name" + "_wrapper" + "Your_language_extension"

তাই যদি আপনার example ফাইল test.c হয়, তবে আপনার র‍্যাপার ফাইল হবে "test_wrapper.c"।

এক্সটেনশন বিল্ড করা (Built the 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
...

এতটুকু, এখন আমরা আমাদের সি ল্যাঙ্গুয়েজকে পাইথন ল্যাঙ্গুয়েজে র‍্যাপ করতে সক্ষম। চেক করতে আপনি সরাসরি রান করতে পারেন বা ভার্চুয়াল এনভায়রনমেন্ট তৈরি করে আলাদা রান করতে পারেন।

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
  1. সি/সি++ প্রোগ্রাম: nth ক্যাটালান সংখ্যা (Catalan Number)

  2. প্রতিযোগিতামূলক প্রোগ্রামিং-এ C/C++, Java এবং Python-এ এক্সটার্নাল ফাইল থেকে Input/Output

  3. পাইথন দিয়ে ওয়েবসাইট ব্লকার তৈরি করা

  4. পাইথনে ফাইল ডিলিট করার পদ্ধতি