Bueno, pues como bien dice Novlucker, yo había intentado/estoy intentando hacer un módulo en C para python que exportara diversas funciones. Según había leído, hacer el módulo directamente en C es bastante engorroso, por lo que lo mejor es utilizar algo como Cython. Lo primero es instalarlo:
http://wiki.cython.org/Installing
Cython cuenta con una amplia documentación donde explica como construir extensiones y las especificaciones de Cython:
Ahora te pongo un ejemplo sencillo de como convertir una función en C en un módulo para python, imaginémonos que queremos exportar esta función, definida en ejemplo.h y con el cuerpo en ejemplo.c:
ejemplo.h#include <windows.h>
int cMsg(char* lpText,char* lpTitle);
ejemplo.c#include "ejemplo.h"
int cMsg(char * lpText,char* lpTitle)
{
return MessageBoxA(0,lpText,lpTitle,0);
}
Ahora crearemos un archivo de código Cython llamado ejemplo.pyx con el siguiente contenido:
ejemplo.pyxcdef extern from "ejemplo.h":
int cMsg(char* lpText,char* lpTitle)
def Msg(text,title):
#Aquí nos aseguramos de que los parámetros pasados a cMsg desde python son de tipo str
if not isinstance(text,unicode):
if not isinstance(text,str):
raise ValueError
("'text' requires text input, got %s" % type
(text
)) utext=text.encode('UTF-8')
if not isinstance(title,unicode):
if not isinstance(title,str):
raise ValueError
("'title' requires text input, got %s" % type
(text
)) utitle=title.encode('UTF-8')
#Llamamos a la función definida en ejemplo.h
ret=cMsg(utext,utitle)
# if ret==0:
# raise WindowsError("invalid args?")
#Retornamos lo devuelto por cMsg
return ret
Ahora creamos un archivo setup.py con el siguiente contenido:
# Build using the command: setup.py build_ext --inplace
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
cmdclass={'build_ext':build_ext},
ext_modules=[Extension("Ejemplo",sources=["ejemplo.pyx","ejemplo.c"],libraries=["USER32","KERNEL32"])]
)
Este archivo se usa como una especie de makefile, donde definimos el nombre de la extensión ("Ejemplo"), los archivos que contienen el código y las librarías que usa nuestro código en C.
Sólo queda construír el módulo, si hicimos todo bien basta con ejecutar el siguiente comando en la shell:
python setup.py build_ext --inplace
Eso debería generarnos un archivo llamdo ejemplo.pyd, que debería de poder ser importado desde cualquier código python
. Si tienes algún problema sólo dilo, es posible que haya cometido algún error ya que no tengo python instalado y no pude probar los códigos, si te falla lo instalo y vemos qué es lo que falla.
Saludos