0Pricing
Python Academy · Pelajaran

cffi: C Foreign Function Interface

Gunakan cffi untuk interoperabilitas C yang lebih sesuai dengan gaya Python, dengan deklarasi C inline.

cffi: C Foreign Function Interface adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Apa Itu cffi?

cffi (Antarmuka Fungsi Asing C) memungkinkan Anda memanggil kode C dari Python menggunakan deklarasi C, bukan kelas ctypes. Cara ini lebih sesuai dengan gaya Python dan sering kali lebih aman.

# 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...

Mode ABI vs API

ffi.dlopen() adalah mode ABI—memanggil pustaka bersama yang sudah ada saat waktu berjalan. Mode API mengompilasi pembungkus C dan lebih cepat serta lebih tangguh.

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

Deklarasi cdef

Gunakan ffi.cdef() untuk mendeklarasikan tanda tangan fungsi C, struktur, dan alias tipe yang ingin Anda gunakan dari Python.

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

Membuat Struktur C

Gunakan ffi.new() untuk mengalokasikan struktur C dan menetapkan bidangnya dari Python.

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

String dan Penyangga

Gunakan ffi.new("char[]", n) untuk penyangga yang dapat diubah dan ffi.string(ptr) untuk mengonversi penunjuk teks C menjadi byte Python.

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()

Mode API dengan Verifikasi

Mode API mengompilasi modul pembungkus C kecil untuk keamanan tipe dan kinerja yang lebih baik. Gunakan ffi.set_source() dan lakukan pembangunan secara luring.

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

Callback dari C ke Python

Gunakan ffi.callback() untuk membungkus fungsi Python sebagai penunjuk fungsi C yang dapat diteruskan ke pustaka 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

Pengelolaan Memori

Objek yang dialokasikan dengan ffi.new() dimiliki oleh Python dan dibebaskan secara otomatis. Gunakan ffi.gc(ptr, destructor) untuk memasang penghancur khusus.

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 vs ctypes

cffi menggunakan teks deklarasi C (lebih alami bagi pengembang C), sedangkan ctypes menggunakan kelas Python. Mode API cffi lebih cepat; ctypes tidak memerlukan kompilasi.

# 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

Menggunakan cffi dengan NumPy

Teruskan data larik NumPy secara langsung ke C melalui cffi menggunakan ffi.cast() dan penunjuk ctypes.data milik larik tersebut.

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*

Penanganan Kesalahan dengan cffi

Fungsi C biasanya menandakan kesalahan melalui nilai pengembalian. Periksa nilai pengembalian dan gunakan ffi.errno untuk kode kesalahan POSIX.

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

Pemeriksaan Singkat

Metode apa yang digunakan cffi untuk mendeklarasikan tanda tangan fungsi C yang ingin Anda panggil?

Ringkasan

cffi menggunakan ffi.cdef() untuk mendeklarasikan tanda tangan C dan ffi.dlopen() untuk pemanggilan pustaka dalam mode ABI. Mode API mengompilasi pembungkus untuk kinerja yang lebih baik. Gunakan ffi.new() untuk memori C dan ffi.callback() untuk callback dari Python ke C.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “cffi: C Foreign Function Interface” gratis?

Ya — teks lengkap “cffi: C Foreign Function Interface” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “cffi: C Foreign Function Interface”?

Gunakan cffi untuk interoperabilitas C yang lebih sesuai dengan gaya Python, dengan deklarasi C inline. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “cffi: C Foreign Function Interface” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa Ekstensi C? Kasus Penggunaan dan Pertimbangan
  2. ctypes: Memanggil Pustaka C dari Python
  3. cffi: C Foreign Function Interface
  4. Menulis Modul Ekstensi C Python
← Kembali ke Python Academy