Nas ultimas semanas antes do carnaval eu estava estudando um projeto - RubyPython - o qual tenho grandes intencoes em contribuir, pois visa integrar python e ruby com uma interface em Ruby, algo que eu, pessoalmente, acho interessante.O projeto usa a Python/C API e a Ruby API (ambas em C), assim, eu tive que dar uma olhada nas duas APIs pra poder entender o codigo.Ja que eu tenho estudado um pouco das duas APIs vou comecar escrevendo sobre a API do Python, porque ha tempos estou pra aprende-la e ate antes do rubypython nao tinha tido coragem pra aprender.Este texto tem como publico alvo quem ja conhece Python e tem uma base na linguagem C. Sera abordado a API da linguagem Python 2.5, que e compativel com as versoes 2.4 e 2.6. A API da versao 3 e diferente e nao sera abordada em nenhum lugar no texto.Mas afinal, por que fazer em C?Ha duas razoes pra usar a Python/C API: escrever modulos de extensao (extension modules) para estender o interpretador Python e embarcar (embed) o interpretador Python (usa-lo como um componente em uma aplicacao).Pode-se entender modulos de extensao como bibliotecas escritas em C/C++ usadas dentro do interpretador Python; e embarcar o interpretador significa usar as facilidades do interpretador a partir da API para escrever codigo em C ou C++.Uma das maiores vantagens de usar a Python/C API e sem duvidas performance. Outra vantagem e poder usar bibliotecas ja prontas e adapta-las pra serem usadas com Python.Um exemplo de modulo de extensao e a biblioteca PIL.O basico da Python/C APIPython e uma linguagem dinamica e nos nao temos que nos preocupamos com tipagem estatica quando escrevemos codigo Python. Assim sendo, a API trata todos objetos Python como sendo de um tipo so: um ponteiro para PyObject: PyObject *.Toda a API esta disponivel atraves do cabecalho Python.h, que normalmente fica em /usr/include/pythonVERSAO, mas voce pode descobrir facilmente usando o seguinte comando:$ python-config --includeNo meu caso eu obtive:hugo@hugo-laptop:~$ python-config --include-I/usr/include/python2.5 -I/usr/include/python2.5O -I e a opcao que deve ser passada ao GCC para incluir esse diretorio nas buscas por cabecalhos.Entao, antes de tudo nos nossos modulos de extensao ou antes de embarcar o python, devemos escrever o seguinte:#include "Python.h"DICA: Evite usar <Python.h> (com <> ao inves de "") pra evitar problemas de multi-plataformas.Incluir o cabecalho Python.h implica em incluir tambem alguns cabecalhos padroes como: <stdio>, <string.h>, <errno.h>, <limits.h> e <stdlib.h> (se disponiveis).DICA: Inclua sempre o cabecalho Python.h antes de qualquer cabecalho, pois o Python define algumas pre-processor definitions nos cabecalhos padroes em algumas plataformas.Todos os "nomes" visiveis atraves do cabecalho Python.h comecam com Py ou _Py, sendo os que comecam com underline usados pra uso interno e devem ser evitados em codigo de producao.Sempre que for necessario usar algum recurso como bibliotecas/modulos padroes do interpretador Python e necessario inicializa-lo e apos todo o uso finaliza-lo. As funcoes Py_Initialize e Py_Finalize sao respectivamente responsaveis por iniciar e finalizar o interpretador.Exemplo #1 - embarcando o interpretador: Usando a biblioteca stringPara mostrar um caso do uso de Python embarcado vamos usar a biblioteca padrao string para tornar a