0Pricing
Python Academy · Pelajaran

ctypes: Memanggil Pustaka C dari Python

Muat pustaka bersama dan panggil fungsi C menggunakan ctypes.

ctypes: Memanggil Pustaka C dari Python adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 ctypes?

ctypes adalah modul pustaka standar untuk memuat pustaka C bersama dan memanggil fungsinya dari Python—tanpa memerlukan kompilasi.

import ctypes

# Load the C standard library
libc = ctypes.CDLL("libc.so.6")   # Linux
# libc = ctypes.CDLL("libSystem.dylib")  # macOS

libc.puts(b"Hello from C!")

Memuat Pustaka

Gunakan ctypes.CDLL untuk konvensi pemanggilan cdecl (sebagian besar pustaka C) dan WinDLL untuk API stdcall Windows.

import ctypes

# Platform-independent approach:
import ctypes.util
libm_name = ctypes.util.find_library("m")
libm = ctypes.CDLL(libm_name)

result = libm.sqrt
result.restype = ctypes.c_double
result.argtypes = [ctypes.c_double]
print(result(2.0))   # 1.4142...

Tipe Data C

Petakan tipe Python ke tipe C menggunakan kelas ctypes: c_int, c_double, c_char_p, c_void_p, dan sebagainya.

import ctypes

x = ctypes.c_int(42)
print(x.value)   # 42

d = ctypes.c_double(3.14)
print(d.value)   # 3.14

s = ctypes.c_char_p(b"hello")
print(s.value)   # b"hello"

Menetapkan argtypes dan restype

Selalu deklarasikan argtypes (tipe parameter) dan restype (tipe pengembalian) untuk menghindari kerusakan diam-diam akibat ketidakcocokan tipe.

import ctypes, ctypes.util

libm = ctypes.CDLL(ctypes.util.find_library("m"))

libm.pow.argtypes = [ctypes.c_double, ctypes.c_double]
libm.pow.restype  = ctypes.c_double

print(libm.pow(2.0, 10.0))   # 1024.0

Meneruskan Penunjuk

Gunakan ctypes.byref(var) atau ctypes.pointer(var) untuk meneruskan penunjuk ke variabel C.

import ctypes

libc = ctypes.CDLL(None)   # None = current process

value = ctypes.c_int(0)
# Passing pointer to C function:
# libc.some_func(ctypes.byref(value))
print(value.value)

Struktur

Definisikan struktur C dengan membuat subkelas ctypes.Structure dan mencantumkan _fields_.

import ctypes

class Point(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_double),
        ("y", ctypes.c_double),
    ]

p = Point(1.0, 2.0)
print(p.x, p.y)   # 1.0 2.0

Larik

Buat larik C dengan TypeClass * N.

import ctypes

IntArray5 = ctypes.c_int * 5
arr = IntArray5(10, 20, 30, 40, 50)
for v in arr:
    print(v, end=" ")   # 10 20 30 40 50

Callback (Penunjuk Fungsi)

Gunakan ctypes.CFUNCTYPE untuk membuat fungsi Python yang dapat dipanggil dari C dan meneruskannya sebagai callback.

import ctypes

CompareFunc = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)

def my_compare(a, b):
    return a - b

c_compare = CompareFunc(my_compare)
# Pass c_compare to a C function expecting a comparator

Memuat DLL Windows

Di Windows, gunakan ctypes.WinDLL untuk DLL yang menggunakan konvensi stdcall (misalnya, API Windows).

import ctypes   # Windows only

kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
kernel32.GetTickCount.restype = ctypes.c_ulong
print(kernel32.GetTickCount())

Penanganan Kesalahan

Periksa ctypes.get_last_error() (Windows), atau gunakan blok coba/tangkap pada tingkat Python untuk kesalahan yang dikembalikan sebagai nilai khusus.

import ctypes

# Many C functions return -1 or NULL on error:
result = some_c_function()
if result == -1:
    raise OSError("C function failed")

# For errno on POSIX:
import os
if result < 0:
    raise OSError(os.strerror(ctypes.get_errno()))

Contoh Praktis: SHA-256 dengan OpenSSL

Panggil SHA256 OpenSSL secara langsung melalui ctypes tanpa pustaka pengikat Python apa pun.

import ctypes, ctypes.util

libcrypto = ctypes.CDLL(ctypes.util.find_library("crypto"))

SHA256 = libcrypto.SHA256
SHA256.argtypes = [ctypes.c_char_p, ctypes.c_size_t, ctypes.c_char_p]
SHA256.restype  = ctypes.c_char_p

buf = ctypes.create_string_buffer(32)
SHA256(b"hello", 5, buf)
print(buf.raw.hex())

Pemeriksaan Singkat

Mengapa Anda harus selalu menetapkan argtypes dan restype pada fungsi ctypes?

Ringkasan

ctypes memuat pustaka C bersama tanpa kompilasi. Deklarasikan argtypes dan restype pada setiap fungsi. Gunakan Structure untuk struktur C, TypeClass * N untuk larik, dan CFUNCTYPE untuk callback.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “ctypes: Memanggil Pustaka C dari Python” gratis?

Ya — teks lengkap “ctypes: Memanggil Pustaka C dari 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 “ctypes: Memanggil Pustaka C dari Python”?

Muat pustaka bersama dan panggil fungsi C menggunakan ctypes. 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 2 dari 4.

Berapa lama pelajaran “ctypes: Memanggil Pustaka C dari 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

  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