Menulis Modul Ekstensi C Python
Bangun ekstensi .so sederhana menggunakan Python/C API.
Menulis Modul Ekstensi C Python adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.
Struktur Ekstensi C
Ekstensi C minimal memiliki: fungsi metode, tabel metode, struktur definisi modul, dan titik masuk PyInit_.
// myext.c skeleton
#include <Python.h>
static PyObject* say_hello(PyObject* self, PyObject* args) {
Py_RETURN_NONE;
}
static PyMethodDef methods[] = {
{"say_hello", say_hello, METH_NOARGS, "Print hello"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT, "myext", NULL, -1, methods
};
PyMODINIT_FUNC PyInit_myext(void) {
return PyModule_Create(&module);
}Menguraikan Argumen
PyArg_ParseTuple(args, "ii", &a, &b) menguraikan argumen Python menjadi variabel C. Kode format: i=int, d=double, s=char*, O=PyObject*.
static PyObject* add(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b))
return NULL;
return PyLong_FromLong(a + b);
}Mengembalikan Nilai
Buat nilai pengembalian Python dengan: PyLong_FromLong, PyFloat_FromDouble, PyUnicode_FromString, Py_BuildValue.
// Return a Python tuple (int, float)
static PyObject* stats(PyObject* self, PyObject* args) {
int n = 10;
double avg = 5.0;
return Py_BuildValue("(id)", n, avg);
// Py_BuildValue format: i=int d=double s=str
}Penghitungan Referensi
Setiap PyObject* memiliki jumlah referensi. Gunakan Py_INCREF/Py_DECREF dengan hati-hati. Nilai pengembalian dari fungsi C memberikan kepemilikan kepada pemanggil (referensi yang kepemilikannya dialihkan).
static PyObject* make_list(PyObject* self, PyObject* args) {
PyObject* lst = PyList_New(3);
for (int i = 0; i < 3; i++) {
// PyList_SET_ITEM steals the reference:
PyList_SET_ITEM(lst, i, PyLong_FromLong(i));
}
return lst; // caller owns the list
}Memunculkan Pengecualian
Gunakan PyErr_SetString(PyExc_ValueError, "msg") untuk memunculkan pengecualian Python dari C, lalu kembalikan NULL.
static PyObject* safe_div(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) return NULL;
if (b == 0) {
PyErr_SetString(PyExc_ZeroDivisionError, "division by zero");
return NULL;
}
return PyLong_FromLong(a / b);
}setup.py untuk Ekstensi C
Gunakan setuptools.Extension untuk mendeklarasikan berkas sumber C. Bangun dengan python setup.py build_ext --inplace.
# setup.py
from setuptools import setup, Extension
setup(
name="myext",
ext_modules=[
Extension(
"myext",
sources=["myext.c"],
extra_compile_args=["-O2"],
)
]
)
# python setup.py build_ext --inplace
# import myext; myext.add(3, 4)Menggunakan Ekstensi yang Dibangun
Setelah dibangun, impor ekstensi seperti modul Python lainnya. Python menemukannya dengan mencari myext.so (atau .pyd di Windows).
# After: python setup.py build_ext --inplace
import myext
print(myext.add(3, 4)) # 7
print(myext.safe_div(10, 2)) # 5
# myext.safe_div(1, 0) # ZeroDivisionErrorArgumen Kata Kunci
Gunakan PyArg_ParseTupleAndKeywords bersama daftar kata kunci untuk mendukung argumen kata kunci dalam fungsi C.
static char* kwargs[] = {"x", "y", NULL};
static PyObject* hypot_c(PyObject* self,
PyObject* args,
PyObject* kw) {
double x, y;
if (!PyArg_ParseTupleAndKeywords(args, kw, "dd",
kwargs, &x, &y))
return NULL;
return PyFloat_FromDouble(sqrt(x*x + y*y));
}Konstanta Tingkat Modul
Tambahkan konstanta bilangan bulat atau teks ke modul dalam PyInit_ menggunakan PyModule_AddIntConstant.
PyMODINIT_FUNC PyInit_myext(void) {
PyObject* m = PyModule_Create(&module);
if (!m) return NULL;
PyModule_AddIntConstant(m, "VERSION", 1);
PyModule_AddStringConstant(m, "AUTHOR", "Alice");
return m;
}Melepaskan GIL
Bungkus pekerjaan C murni dengan Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS agar thread Python lain dapat berjalan saat kode C dieksekusi.
static PyObject* heavy(PyObject* self, PyObject* args) {
long n;
if (!PyArg_ParseTuple(args, "l", &n)) return NULL;
long result;
Py_BEGIN_ALLOW_THREADS
result = slow_c_computation(n); // GIL released
Py_END_ALLOW_THREADS
return PyLong_FromLong(result);
}Menguji Ekstensi
Uji ekstensi C melalui antarmuka Python menggunakan pytest. Tidak diperlukan alat pengujian C khusus.
# test_myext.py
import pytest
import myext
def test_add(): assert myext.add(3, 4) == 7
def test_zero_div():
with pytest.raises(ZeroDivisionError):
myext.safe_div(1, 0)Pemeriksaan Singkat
Apa yang harus dikembalikan fungsi ekstensi C untuk menandakan bahwa pengecualian Python telah ditetapkan?
Ringkasan
Ekstensi C memerlukan: fungsi metode (menguraikan argumen dan mengembalikan PyObject*), tabel metode, struktur definisi modul, dan PyInit_name(). Munculkan pengecualian dengan menetapkannya menggunakan PyErr_SetString dan mengembalikan NULL. Lepaskan GIL untuk pekerjaan C murni.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menulis Modul Ekstensi C Python” gratis?
Ya — teks lengkap “Menulis Modul Ekstensi C Python” 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 “Menulis Modul Ekstensi C Python”?
Bangun ekstensi .so sederhana menggunakan Python/C API. 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 4 dari 4.
Berapa lama pelajaran “Menulis Modul Ekstensi C Python” 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
- Mengapa Ekstensi C? Kasus Penggunaan dan Pertimbangan
- ctypes: Memanggil Pustaka C dari Python
- cffi: C Foreign Function Interface
- Menulis Modul Ekstensi C Python