0Pricing
Python Academy · Lección

ctypes: llamada a bibliotecas C desde Python

Cargue bibliotecas compartidas y llame a funciones C mediante ctypes.

ctypes: llamada a bibliotecas C desde Python es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

¿Qué es ctypes?

ctypes es un módulo de la biblioteca estándar para cargar bibliotecas compartidas de C y llamar a sus funciones desde Python, sin necesidad de compilación.

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!")

Carga de bibliotecas

Use ctypes.CDLL para la convención de llamada cdecl (la mayoría de las bibliotecas de C) y WinDLL para las API de Windows que usan stdcall.

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...

Tipos de datos de C

Asigne tipos de Python a tipos de C mediante las clases de ctypes: c_int, c_double, c_char_p, c_void_p, etc.

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"

Configuración de argtypes y restype

Declare siempre argtypes (tipos de parámetros) y restype (tipo de retorno) para evitar fallos silenciosos causados por incompatibilidades de tipos.

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

Paso de punteros

Use ctypes.byref(var) o ctypes.pointer(var) para pasar un puntero a una variable de 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)

Estructuras

Defina estructuras de C creando subclases de ctypes.Structure y enumerando _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

Matrices

Cree matrices de C con 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

Callbacks (punteros a funciones)

Use ctypes.CFUNCTYPE para crear una función de Python invocable desde C y pasarla como 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

Carga de DLL de Windows

En Windows, use ctypes.WinDLL para las DLL que utilizan la convención stdcall (por ejemplo, la API de Windows).

import ctypes   # Windows only

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

Gestión de errores

Compruebe ctypes.get_last_error() (Windows) o use try/except a nivel de Python para los errores devueltos como valores especiales.

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

Ejemplo práctico: SHA-256 con OpenSSL

Llame directamente a SHA256 de OpenSSL mediante ctypes, sin ninguna biblioteca de bindings de Python.

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

Comprobación rápida

¿Por qué debe establecer siempre argtypes y restype en una función de ctypes?

Recapitulación

ctypes carga bibliotecas compartidas de C sin compilación. Declare argtypes y restype en cada función. Use Structure para las estructuras de C, TypeClass * N para las matrices y CFUNCTYPE para los callbacks.

Preguntas frecuentes

¿La lección «ctypes: llamada a bibliotecas C desde Python» es gratis?

Sí — el texto completo de «ctypes: llamada a bibliotecas C desde Python» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «ctypes: llamada a bibliotecas C desde Python»?

Cargue bibliotecas compartidas y llame a funciones C mediante ctypes. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «ctypes: llamada a bibliotecas C desde Python»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Por qué extensiones C? Casos de uso y compensaciones
  2. ctypes: llamada a bibliotecas C desde Python
  3. cffi: interfaz de funciones externas de C
  4. Escritura de un módulo de extensión C para Python
← Volver a Python Academy