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.0Meneruskan 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.0Larik
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 50Callback (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 comparatorMemuat 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
- Mengapa Ekstensi C? Kasus Penggunaan dan Pertimbangan
- ctypes: Memanggil Pustaka C dari Python
- cffi: C Foreign Function Interface
- Menulis Modul Ekstensi C Python