cffi: interface de funções externas em C
Use cffi para uma interoperação com C mais próxima do estilo Python, com declarações C embutidas.
cffi: interface de funções externas em C é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 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 é cffi?
cffi (Interface de Funções Estrangeiras de C) permite chamar código C a partir do Python usando declarações C em vez de classes ctypes. Ele é mais idiomático em Python e frequentemente mais seguro.
# pip install cffi
from cffi import FFI
ffi = FFI()
ffi.cdef("double sqrt(double x);")
libm = ffi.dlopen(None) # current process
print(libm.sqrt(2.0)) # 1.4142...Modo ABI versus modo API
ffi.dlopen() é o modo ABI — ele chama uma biblioteca compartilhada existente em tempo de execução. O modo API compila um wrapper C e é mais rápido e robusto.
from cffi import FFI
ffi = FFI()
# ABI mode (no compile step):
ffi.cdef("int abs(int x);")
libc = ffi.dlopen("libc.so.6") # Linux
print(libc.abs(-42)) # 42Declarações cdef
Utilize ffi.cdef() para declarar assinaturas de funções C, estruturas e typedefs que você deseja usar a partir do Python.
from cffi import FFI
ffi = FFI()
ffi.cdef("""
typedef struct {
double x;
double y;
} Point;
double distance(Point a, Point b);
""")
# lib = ffi.dlopen("mylib.so")Criação de estruturas C
Utilize ffi.new() para alocar uma estrutura C e definir seus campos a partir do Python.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef struct { int x; int y; } Vec2;")
lib = ffi.dlopen(None)
v = ffi.new("Vec2 *")
v.x = 3
v.y = 4
print(v.x, v.y) # 3 4Strings e buffers
Utilize ffi.new("char[]", n) para buffers mutáveis e ffi.string(ptr) para converter um ponteiro para string C em bytes do Python.
from cffi import FFI
ffi = FFI()
buf = ffi.new("char[]", b"hello world")
print(ffi.string(buf)) # b"hello world"
# Mutable buffer for output:
out = ffi.new("char[128]")
# c_func(out, 128) # fill the buffer
# result = ffi.string(out).decode()Modo API com verificação
O modo API compila um pequeno módulo wrapper em C para oferecer maior segurança de tipos e desempenho. Utilize ffi.set_source() e faça a compilação offline.
from cffi import FFI
ffi = FFI()
ffi.cdef("int add(int a, int b);")
ffi.set_source("_mylib",
"""
int add(int a, int b) { return a + b; }
"""
)
# Build: python build_mylib.py
# from _mylib import ffi, lib
# print(lib.add(3, 4)) # 7Callbacks de C para Python
Utilize ffi.callback() para encapsular uma função Python como um ponteiro para função C que pode ser passado a uma biblioteca C.
from cffi import FFI
ffi = FFI()
ffi.cdef("typedef int (*compare_fn)(int, int);")
@ffi.callback("int(int, int)")
def compare(a, b):
return a - b
# pass compare to a C sort functionGerenciamento de memória
Os objetos alocados com ffi.new() pertencem ao Python e são liberados automaticamente. Utilize ffi.gc(ptr, destructor) para associar um destrutor personalizado.
from cffi import FFI
ffi = FFI()
# ptr freed when Python GC collects it:
buf = ffi.new("int[10]")
buf[0] = 42
print(buf[0]) # 42
# Custom destructor:
# ptr = ffi.gc(lib.alloc(), lib.free)cffi versus ctypes
cffi usa strings de declarações C (mais naturais para desenvolvedores C), enquanto ctypes usa classes Python. O modo API do cffi é mais rápido; ctypes não exige compilação.
# ctypes approach:
import ctypes
libc = ctypes.CDLL("libc.so.6")
libc.abs.restype = ctypes.c_int
libc.abs.argtypes = [ctypes.c_int]
print(libc.abs(-5)) # 5
# cffi approach:
from cffi import FFI; ffi = FFI()
ffi.cdef("int abs(int);")
lib = ffi.dlopen(None)
print(lib.abs(-5)) # 5Uso de cffi com NumPy
Passe os dados de uma matriz NumPy diretamente para C por meio de cffi usando ffi.cast() e o ponteiro ctypes.data da matriz.
import numpy as np
from cffi import FFI
ffi = FFI()
arr = np.array([1.0, 2.0, 3.0])
ptr = ffi.cast("double *", arr.ctypes.data)
# Now ptr can be passed to a C function expecting double*Tratamento de erros com cffi
As funções C normalmente sinalizam erros por meio de valores de retorno. Verifique os valores retornados e utilize ffi.errno para códigos de erro POSIX.
import errno as errno_mod
from cffi import FFI
ffi = FFI()
ffi.cdef("int open(const char *path, int flags);")
lib = ffi.dlopen(None)
fd = lib.open(b"/nonexistent", 0)
if fd == -1:
err = ffi.errno
raise OSError(err, "open failed")Verificação rápida
Que método o cffi utiliza para declarar as assinaturas das funções C que você deseja chamar?
Recapitulação
cffi usa ffi.cdef() para declarar assinaturas C e ffi.dlopen() para chamadas de bibliotecas no modo ABI. O modo API compila um wrapper para oferecer melhor desempenho. Utilize ffi.new() para memória C e ffi.callback() para callbacks de Python para C.
Perguntas Frequentes
A aula “cffi: interface de funções externas em C” é grátis?
Sim — o texto completo de “cffi: interface de funções externas em C” é 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 “cffi: interface de funções externas em C”?
Use cffi para uma interoperação com C mais próxima do estilo Python, com declarações C embutidas. 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 3 de 4.
Quanto tempo leva a aula “cffi: interface de funções externas em C”?
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