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.0Passagem 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.0Matrizes
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 50Callbacks (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 comparatorCarregamento 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
- Por que extensões C? Casos de uso e compensações
- ctypes: chamando bibliotecas C do Python
- cffi: interface de funções externas em C
- Escrita de um módulo de extensão C para Python