0Pricing
Python Academy · Ders

Python C Uzantısı Modülü Yazma

Python/C API kullanarak basit bir .so uzantısı oluşturun.

Python C Uzantısı Modülü Yazma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

C Uzantısının Anatomisi

En temel C uzantısında şunlar bulunur: yöntem işlevleri, bir yöntem tablosu, bir modül tanım yapısı ve bir PyInit_ giriş noktası.

// 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);
}

Argümanları Ayrıştırma

PyArg_ParseTuple(args, "ii", &a, &b), Python argümanlarını C değişkenlerine ayrıştırır. Biçim kodları: 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);
}

Değer Döndürme

Python dönüş değerlerini şu işlevlerle oluşturun: 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
}

Referans Sayımı

Her PyObject* bir referans sayısına sahiptir. Py_INCREF/Py_DECREF işlevlerini dikkatle kullanın. C işlevlerinden döndürülen değerler çağırana sahiplik verir (çalınmış referanslar).

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
}

İstisna Fırlatma

C'den bir Python istisnası fırlatmak için PyErr_SetString(PyExc_ValueError, "msg") kullanın, ardından NULL döndürün.

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);
}

C Uzantıları için setup.py

C kaynak dosyalarını bildirmek için setuptools.Extension kullanın. python setup.py build_ext --inplace ile derleyin.

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

Derlenen Uzantıyı Kullanma

Derleme tamamlandıktan sonra uzantıyı diğer tüm Python modülleri gibi içe aktarın. Python, myext.so dosyasını (Windows'ta .pyd) arayarak uzantıyı bulur.

# 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)         # ZeroDivisionError

Anahtar Sözcük Argümanları

C işlevlerinde anahtar sözcük argümanlarını desteklemek için PyArg_ParseTupleAndKeywords işlevini bir anahtar sözcük listesiyle kullanın.

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));
}

Modül Düzeyi Sabitleri

PyInit_ içinde PyModule_AddIntConstant kullanarak modüle tamsayı veya dize sabitleri ekleyin.

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;
}

GIL'i Serbest Bırakma

C kodu çalışırken diğer Python iş parçacıklarının çalışmasına izin vermek için saf C çalışmasını Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS ile sarın.

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);
}

Uzantıyı Test Etme

C uzantılarını pytest kullanarak Python arayüzleri üzerinden test edin. Özel C test araçları gerekmez.

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

Hızlı Kontrol

Bir Python istisnasının ayarlandığını belirtmek için C uzantısı işlevi ne döndürmelidir?

Özet

Bir C uzantısının şunlara ihtiyacı vardır: yöntem işlevleri (argümanları ayrıştıran ve PyObject* döndüren), bir yöntem tablosu, bir modül tanım yapısı ve PyInit_name(). İstisnaları PyErr_SetString ile ayarlayıp NULL döndürerek fırlatın. Saf C çalışması için GIL'i serbest bırakın.

Sıkça Sorulan Sorular

“Python C Uzantısı Modülü Yazma” dersi ücretsiz mi?

Evet — “Python C Uzantısı Modülü Yazma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Python C Uzantısı Modülü Yazma” dersinde ne öğreneceğim?

Python/C API kullanarak basit bir .so uzantısı oluşturun. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Python C Uzantısı Modülü Yazma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. C Uzantıları Neden Kullanılır? Kullanım Alanları ve Ödünleşimler
  2. ctypes: Python'dan C Kitaplıklarını Çağırma
  3. cffi: C Yabancı İşlev Arayüzü
  4. Python C Uzantısı Modülü Yazma
← Python Academy Sayfasına Dön