Extendendo Python com cTypes
Esses dias tive que implementar algumas coisas em C, por dois motivos, primeiro eu queria comparar a velocidade da mesma aplicação em duas linguagens (Python e C) e segundo, já estava na hora de começar a usar C com Python
.
Os primeiros testes que fiz (com a ajuda do Gean) foi usando a documentação oficial do Python que pode ser encontrada aqui. Foi relativamente fácil e não tive muitos (mais do que nenhum) problemas.
Porém a perfomance não era a esperada, então parti para outros testes, e um desses foi exatamente sobre a biblioteca ctypes. Atualmente ela é um pacote "third-part" (feito por terceiros), porém, será builtin na versão 2.5 ![]()
Sua instalação é simples e seu uso mais ainda.
Então vamos aos códigos, nós vamos fazer a clássica função fatorial. Pra começar precisamos definir os arquivos:
- teste_fatorial.py Arquivo que vai chamar a função em C
- fatorial.c Código que contém o algorítimo da função
Aqui está a implementação dos arquivos:
fatorial.c
[c]
/*
* Pra compilar esse codigo como biblioteca usando o GCC execute:
* gcc -o fatorial.so -shared fatorial.c
*/
#include
int
fatorial(int numero, int mult)
{
if (numero == 1)
{
return mult;
}
else
{
return fatorial(--numero, mult*numero);
}
}
[/c]
teste_fatorial.py
[python]
import ctypes
# A biblioteca tem que estar no mesmo diretorio do teste_fatorial.py
Fatorial = ctypes.CDLL("./fatorial.so")
# Seta o retorno da funcao para inteiro
Fatorial.fatorial.restype = ctypes.c_int
# Imprime o resultado da funcao
print Fatorial.fatorial(5, 1)
[/python]
Como você pode ver, nenhuma alteração no código em C precisa ser feita, você pode importar qualquer modulo pré-compilado que já exista, como a libc, a libgd e muitas outras já existentes no Linux.
Depois de carregar uma biblioteca, é recomendável que você altere o restype das funções que você vai chamar, por exemplo, no exemplo do fatorial eu setei para c_int, pois isso é o que a função retorna, um inteiro. Essa e outras observações você encontra na documentação do ctypes e na página do Python
Sem comentários (ainda) para “Extendendo Python com cTypes”
Deixe um comentário |


fudido |_|
Não esquece que dados alocados dinamicamente(malloc) devem ser desalocados pois o Python não faz isso.
Mas o ctypes é macumba da braba!
Sabia que C é f#da?
C é o cara.
C tembrochove?