0Pricing
Python Academy · Aula

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))   # 42

Declaraçõ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 4

Strings 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))   # 7

Callbacks 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 function

Gerenciamento 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))    # 5

Uso 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

  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