cffi: Antara Muka Fungsi Asing C
Gunakan cffi untuk saling kendali C yang lebih idiomatik dalam Python dengan pengisytiharan C sebaris.
cffi: Antara Muka Fungsi Asing C ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.
Apakah cffi?
cffi (Antara Muka Fungsi Asing C) membolehkan anda memanggil kod C daripada Python menggunakan pengisytiharan C dan bukannya kelas ctypes. Kaedah ini lebih menepati gaya Python dan selalunya lebih selamat.
# 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...Mod ABI berbanding API
ffi.dlopen() ialah mod ABI — kaedah ini memanggil pustaka dikongsi sedia ada pada masa jalan. Mod API menyusun pembalut C dan lebih pantas serta teguh.
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)) # 42Pengisytiharan cdef
Gunakan ffi.cdef() untuk mengisytiharkan tandatangan fungsi C, struktur dan typedef yang ingin anda gunakan daripada 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")Mencipta Struktur C
Gunakan ffi.new() untuk memperuntukkan struktur C dan menetapkan medannya daripada 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 4Rentetan dan Penimbal
Gunakan ffi.new("char[]", n) untuk penimbal boleh ubah dan ffi.string(ptr) untuk menukar penuding rentetan C kepada bait 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()Mod API dengan verify
Mod API menyusun modul pembalut C kecil untuk keselamatan jenis dan prestasi yang lebih baik. Gunakan ffi.set_source() dan bina tanpa sambungan.
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)) # 7Panggilan Balik daripada C ke Python
Gunakan ffi.callback() untuk membungkus fungsi Python sebagai penuding fungsi C yang boleh dihantar kepada 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 functionPengurusan Memori
Objek yang diperuntukkan dengan ffi.new() dimiliki oleh Python dan dibebaskan secara automatik. Gunakan ffi.gc(ptr, destructor) untuk melampirkan pemusnah tersuai.
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 berbanding ctypes
cffi menggunakan rentetan pengisytiharan C (lebih semula jadi untuk pembangun C), manakala ctypes menggunakan kelas Python. Mod API cffi lebih pantas; ctypes tidak memerlukan penyusunan.
# 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)) # 5Menggunakan cffi dengan NumPy
Hantar data tatasusunan NumPy terus kepada C melalui cffi menggunakan ffi.cast() dan penuding ctypes.data tatasusunan 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*Pengendalian Ralat dengan cffi
Fungsi C biasanya menandakan ralat melalui nilai pulangan. Semak nilai pulangan dan gunakan ffi.errno untuk kod ralat 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")Semakan Ringkas
Apakah kaedah yang digunakan oleh cffi untuk mengisytiharkan tandatangan fungsi C yang ingin anda panggil?
Ringkasan
cffi menggunakan ffi.cdef() untuk mengisytiharkan tandatangan C dan ffi.dlopen() untuk panggilan pustaka dalam mod ABI. Mod API menyusun pembalut untuk prestasi yang lebih baik. Gunakan ffi.new() untuk memori C dan ffi.callback() untuk panggilan balik Python-ke-C.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 76
- Pelajaran
- 320
Soalan Lazim
Adakah pelajaran “cffi: Antara Muka Fungsi Asing C” percuma?
Ya — teks penuh “cffi: Antara Muka Fungsi Asing C” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “cffi: Antara Muka Fungsi Asing C”?
Gunakan cffi untuk saling kendali C yang lebih idiomatik dalam Python dengan pengisytiharan C sebaris. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Python Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “cffi: Antara Muka Fungsi Asing C” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengapa Sambungan C? Kegunaan dan Pertukaran
- ctypes: Memanggil Pustaka C daripada Python
- cffi: Antara Muka Fungsi Asing C
- Menulis Modul Sambungan C Python