Este repositório contém um exemplo de integração entre C e Python utilizando uma função recursiva de cálculo de fatorial. O código em C é compilado em uma DLL (Dynamic Link Library) que é carregada no Python através do módulo ctypes
. O objetivo deste projeto é demonstrar como criar bibliotecas em C e utilizá-las diretamente em scripts Python.
- Implementação de uma função recursiva de fatorial em C.
- Compilação de código C em uma DLL.
- Integração da DLL com Python usando o módulo
ctypes
.
-
Python: Certifique-se de ter instalado o Python, com uma versão compatível com o GCC (compilador).
- Se o Python for de 64 bits, você precisará do compilador GCC de 64 bits. Da mesma forma, se o Python for de 32 bits, o GCC deve ser a versão de 32 bits.
-
Compilador GCC: Para compilar o código em C e gerar a DLL.
- No Windows, você pode usar o MinGW-w64 para versões de 64 bits ou MinGW para 32 bits.
Para verificar se seu Python e GCC estão na mesma arquitetura, use os seguintes comandos:
-
Para verificar se o Python é 32 ou 64 bits:
python -c "import struct; print(struct.calcsize('P') * 8)"
-
Para verificar a arquitetura do GCC:
gcc -v
Crie um arquivo chamado fatorial.c
com o seguinte código:
#include <stdio.h>
__declspec(dllexport) int fatorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * fatorial(n - 1);
}
}
Para compilar o código em C e gerar a DLL, siga os passos abaixo:
-
Abra o terminal no diretório onde o arquivo
fatorial.c
está localizado. -
Execute o seguinte comando para compilar e gerar a DLL:
gcc -shared -o fatorial.dll fatorial.c
Este comando gera o arquivo
fatorial.dll
, que contém a funçãofatorial
.
Agora, você pode usar a função fatorial
no Python através do módulo ctypes
.
Crie um arquivo Python, por exemplo, fatorial.py
, com o seguinte código:
import ctypes as c
dll = c.CDLL('./fatorial.dll')
dll.fatorial.argtypes = (c.c_int,)
dll.fatorial.restype = c.c_int
n = 6
fat = dll.fatorial(n)
print(f"O fatorial de {n} é: {fat}")
-
A função
fatorial
é recursiva e calcula o fatorial de um número inteiro positivon
. Sen
for 0 ou 1, a função retorna 1. Caso contrário, ela chama a si mesma até quen
seja reduzido a 1. -
O
__declspec(dllexport)
é utilizado para exportar a função, o que significa que ela ficará disponível para outros programas (como o Python) quando a DLL for carregada. -
O comando
gcc -shared
gera um arquivo de biblioteca dinâmica (fatorial.dll
) que contém a função fatorial, disponível para ser usada por outros programas.
-
ctypes.CDLL
carrega a biblioteca dinâmica gerada (fatorial.dll
), permitindo acesso às funções exportadas. -
dll.fatorial.argtypes
define os tipos dos argumentos que a funçãofatorial
aceita. No caso, um único argumento do tipoint
(c.c_int
). -
dll.fatorial.restype
define o tipo de retorno da funçãofatorial
, que é umint
(c.c_int
). -
Finalmente, chamamos a função
dll.fatorial(n)
no Python, passando um valor inteiro como argumento e imprimimos o resultado.
-
Certifique-se de que o Python e o compilador GCC estejam na mesma arquitetura (64 bits ou 32 bits).
-
Ao compilar no Windows, tenha certeza de que as bibliotecas do MinGW ou MinGW-w64 estão configuradas corretamente no caminho do sistema para que o GCC possa ser invocado a partir do terminal.
-
Você pode carregar a DLL no Python diretamente com o caminho relativo (
'./fatorial.dll'
) ou com o caminho completo onde a DLL está armazenada.