Python Academy · पाठ

cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस

इनलाइन C घोषणाओं के साथ अधिक Python-जैसे C इंटरऑप के लिए cffi का उपयोग करें।

पाठ 3, कुल 4 में से13 चरण

cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

cffi क्या है?

cffi (C फ़ॉरेन फ़ंक्शन इंटरफ़ेस) आपको ctypes क्लास के बजाय C घोषणाओं का उपयोग करके Python से C कोड कॉल करने देता है। यह अधिक Python-सदृश और अक्सर अधिक सुरक्षित है।

# pip install cffi
from cffi import FFI
ffi = FFI()

ffi.cdef("double sqrt(double x);")
libm = ffi.dlopen(None)   # current process
print(libm.sqrt(2.0))     # 1.4142...

ABI बनाम API मोड

ffi.dlopen() ABI मोड है—यह रनटाइम पर किसी मौजूदा साझा लाइब्रेरी को कॉल करता है। API मोड में C रैपर संकलित किया जाता है और यह अधिक तेज़ तथा अधिक विश्वसनीय होता है।

from cffi import FFI
ffi = FFI()

# ABI mode (no compile step):
ffi.cdef("int abs(int x);")
libc = ffi.dlopen("libc.so.6")  # Linux
print(libc.abs(-42))   # 42

cdef घोषणाएँ

Python से उपयोग किए जाने वाले C फ़ंक्शन सिग्नेचर, स्ट्रक्चर और typedef घोषित करने के लिए ffi.cdef() का उपयोग करें।

from cffi import FFI
ffi = FFI()

ffi.cdef("""
    typedef struct {
        double x;
        double y;
    } Point;

    double distance(Point a, Point b);
""")

# lib = ffi.dlopen("mylib.so")

C स्ट्रक्चर बनाना

C स्ट्रक्चर आवंटित करने और Python से उसके फ़ील्ड सेट करने के लिए ffi.new() का उपयोग करें।

from cffi import FFI
ffi = FFI()

ffi.cdef("typedef struct { int x; int y; } Vec2;")
lib = ffi.dlopen(None)

v = ffi.new("Vec2 *")
v.x = 3
v.y = 4
print(v.x, v.y)   # 3 4

स्ट्रिंग और बफ़र

परिवर्तनीय बफ़र के लिए ffi.new("char[]", n) और C स्ट्रिंग पॉइंटर को Python बाइट्स में बदलने के लिए ffi.string(ptr) का उपयोग करें।

from cffi import FFI
ffi = FFI()

buf = ffi.new("char[]", b"hello world")
print(ffi.string(buf))   # b"hello world"

# Mutable buffer for output:
out = ffi.new("char[128]")
# c_func(out, 128)  # fill the buffer
# result = ffi.string(out).decode()

verify के साथ API मोड

API मोड बेहतर प्रकार-सुरक्षा और प्रदर्शन के लिए एक छोटा C रैपर मॉड्यूल संकलित करता है। ffi.set_source() का उपयोग करें और ऑफ़लाइन निर्माण करें।

from cffi import FFI
ffi = FFI()

ffi.cdef("int add(int a, int b);")
ffi.set_source("_mylib",
    """
    int add(int a, int b) { return a + b; }
    """
)

# Build: python build_mylib.py
# from _mylib import ffi, lib
# print(lib.add(3, 4))   # 7

C से Python के callback

किसी Python फ़ंक्शन को ऐसे C फ़ंक्शन पॉइंटर में रैप करने के लिए ffi.callback() का उपयोग करें, जिसे C लाइब्रेरी को पास किया जा सके।

from cffi import FFI
ffi = FFI()
ffi.cdef("typedef int (*compare_fn)(int, int);")

@ffi.callback("int(int, int)")
def compare(a, b):
    return a - b

# pass compare to a C sort function

मेमोरी प्रबंधन

ffi.new() से आवंटित ऑब्जेक्ट Python के स्वामित्व में होते हैं और स्वचालित रूप से मुक्त हो जाते हैं। कस्टम विनाशक जोड़ने के लिए ffi.gc(ptr, destructor) का उपयोग करें।

from cffi import FFI
ffi = FFI()

# ptr freed when Python GC collects it:
buf = ffi.new("int[10]")
buf[0] = 42
print(buf[0])   # 42

# Custom destructor:
# ptr = ffi.gc(lib.alloc(), lib.free)

cffi बनाम ctypes

cffi C घोषणा स्ट्रिंग का उपयोग करता है (जो C डेवलपर के लिए अधिक स्वाभाविक है), जबकि ctypes Python क्लास का उपयोग करता है। cffi का API मोड अधिक तेज़ है; ctypes के लिए संकलन की आवश्यकता नहीं होती।

# ctypes approach:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.abs.restype = ctypes.c_int
libc.abs.argtypes = [ctypes.c_int]
print(libc.abs(-5))   # 5

# cffi approach:
from cffi import FFI; ffi = FFI()
ffi.cdef("int abs(int);")
lib = ffi.dlopen(None)
print(lib.abs(-5))    # 5

NumPy के साथ cffi का उपयोग करना

ffi.cast() और ऐरे के ctypes.data पॉइंटर का उपयोग करके NumPy ऐरे का डेटा सीधे cffi के माध्यम से C को पास करें।

import numpy as np
from cffi import FFI
ffi = FFI()

arr = np.array([1.0, 2.0, 3.0])
ptr = ffi.cast("double *", arr.ctypes.data)
# Now ptr can be passed to a C function expecting double*

cffi के साथ त्रुटि प्रबंधन

C फ़ंक्शन आमतौर पर लौटाए गए मानों के माध्यम से त्रुटियों का संकेत देते हैं। लौटाए गए मानों की जाँच करें और POSIX त्रुटि कोड के लिए ffi.errno का उपयोग करें।

import errno as errno_mod
from cffi import FFI
ffi = FFI()
ffi.cdef("int open(const char *path, int flags);")
lib = ffi.dlopen(None)

fd = lib.open(b"/nonexistent", 0)
if fd == -1:
    err = ffi.errno
    raise OSError(err, "open failed")

त्वरित जाँच

जिन C फ़ंक्शन सिग्नेचर को आप कॉल करना चाहते हैं, उन्हें घोषित करने के लिए cffi किस विधि का उपयोग करता है?

पुनरावलोकन

cffi C सिग्नेचर घोषित करने के लिए ffi.cdef() और ABI-मोड लाइब्रेरी कॉल के लिए ffi.dlopen() का उपयोग करता है। बेहतर प्रदर्शन के लिए API मोड एक रैपर संकलित करता है। C मेमोरी के लिए ffi.new() और Python से C callback के लिए ffi.callback() का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस” पाठ निःशुल्क है?

हाँ—“cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस” में मैं क्या सीखूँगा?

इनलाइन C घोषणाओं के साथ अधिक Python-जैसे C इंटरऑप के लिए cffi का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. C एक्सटेंशन क्यों? उपयोग और समझौते
  2. ctypes: Python से C लाइब्रेरी कॉल करना
  3. cffi: C फ़ॉरेन फ़ंक्शन इंटरफ़ेस
  4. Python C एक्सटेंशन मॉड्यूल लिखना
← Python Academy पर वापस जाएँ