0Pricing
Python Academy · Aula

ctypes: chamando bibliotecas C do Python

Carregue bibliotecas compartilhadas e chame funções C usando ctypes.

ctypes: chamando bibliotecas C do Python é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

O que é ctypes?

ctypes é um módulo da biblioteca padrão para carregar bibliotecas C compartilhadas e chamar suas funções a partir do Python — sem necessidade de compilação.

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

Carregamento de bibliotecas

Utilize ctypes.CDLL para a convenção de chamada cdecl (a maioria das bibliotecas C) e WinDLL para APIs Windows que usam 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 dados C

Mapeie tipos Python para tipos C usando classes 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"

Definição de argtypes e restype

Sempre declare argtypes (tipos de parâmetros) e restype (tipo de retorno) para evitar falhas silenciosas causadas 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

Passagem de ponteiros

Utilize ctypes.byref(var) ou ctypes.pointer(var) para passar um ponteiro para uma variável 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)

Estruturas

Defina estruturas C criando subclasses de ctypes.Structure e listando _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

Matrizes

Crie matrizes C com 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 (ponteiros para funções)

Utilize ctypes.CFUNCTYPE para criar uma função Python chamável por C e passá-la 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

Carregamento de DLLs do Windows

No Windows, utilize ctypes.WinDLL para DLLs que usam a convenção stdcall (por exemplo, a API do Windows).

import ctypes   # Windows only

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

Tratamento de erros

Verifique ctypes.get_last_error() (Windows) ou use try/except no nível do Python para erros retornados como valores especiais.

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

Exemplo prático: SHA-256 com OpenSSL

Chame diretamente o SHA256 do OpenSSL por meio de ctypes, sem nenhuma biblioteca de ligação com 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())

Verificação rápida

Por que você deve sempre definir argtypes e restype em uma função ctypes?

Recapitulação

ctypes carrega bibliotecas C compartilhadas sem compilação. Declare argtypes e restype em todas as funções. Utilize Structure para estruturas C, TypeClass * N para matrizes e CFUNCTYPE para callbacks.

Perguntas Frequentes

A aula “ctypes: chamando bibliotecas C do Python” é grátis?

Sim — o texto completo de “ctypes: chamando bibliotecas C do Python” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “ctypes: chamando bibliotecas C do Python”?

Carregue bibliotecas compartilhadas e chame funções C usando ctypes. Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “ctypes: chamando bibliotecas C do Python”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que extensões C? Casos de uso e compensações
  2. ctypes: chamando bibliotecas C do Python
  3. cffi: interface de funções externas em C
  4. Escrita de um módulo de extensão C para Python
← Voltar para Python Academy