Dónde escribir código C para extensiones de Python
Puedes escribirlo en cualquier lugar, lo importante es el proceso de compilación. Déjame guiarte a través del proceso de compilación.
Los métodos de compilación de las extensiones C son diferentes en Windows y Linux. Veamos primero la versión de Windows.
Usamos C para implementar una suma simple.
Primero cree un nuevo archivo add.c con el siguiente código: #include?
static?PyObject*?add(PyObject?*self,?PyObject ? *args);?
// Asegúrese de declararlos estáticos para limitarlos al alcance de este archivo. Casi todos los argumentos son de tipo PyObject; en Python, todo es un objeto.
static?PyObject*?add(PyObject*?self,?PyObject*?args)?
{?
int?x=0? p>
int?y=0;
int?z=0;
if?(! ?PyArg_ParseTuple(args, ?" i|i", ? &x, ? &y))
return?NULL;
/* El primer parámetro es self, que usa Python y lo usan todas las funciones. args es una lista de argumentos. Combina todos los parámetros en una sola cadena. Necesitamos analizar nuestros argumentos a partir de esta cadena, pyArg_ParseTuple hace precisamente eso. El primer parámetro es args, ? es el parámetro que queremos convertir. El segundo parámetro es el símbolo de formato. "s" significa que es una cadena. Para extraer un parámetro de args, escriba "s"; para extraer un parámetro de args, escriba "s"; para extraer dos parámetros, escriba "s|s" si es una cadena y un int, escriba "s| i; ". El tercer parámetro es la ubicación real de los parámetros extraídos. Se debe pasar la dirección de este parámetro. Para agregar, extraerá los dos parámetros xey respectivamente. *//p>
z=x+y;
return?Py_BuildValue("i",?z);
/*Después de llamar, Es necesario devolver los resultados. Este resultado es el tipo de c o un tipo que definimos nosotros mismos. Debe convertirse a PyObject para que Python lo reconozca. Esto se hace a través de Py_BuildValue. Es el proceso inverso de PyArg_ParseTuple. Su primer parámetro es el mismo que el segundo parámetro de PyArg_ParseTuple,? es un símbolo de formato. El tercer parámetro es el parámetro que necesitamos convertir. py_BuildValue combinará todos los valores de retorno en una tupla para que Python la use. }
static?PyMethodDef?addMethods[]? =
{?
{"add",?add,?METH_VARARGS,?" Ejecutar?a? shell?command."},?
{NULL,?NULL,?0,?NULL}
};?
/* Esta es una estructura c . Él está aquí para completar el mapeo. Necesitamos asignar todas las funciones de extensión a esta tabla. El primer campo de la tabla es lo que Python realmente reconoce. ¿Es el nombre de un método de Python? El segundo campo es el nombre de la función en Python que implementa el nombre del método. El tercer campo es METH_VARARGS, que le dice a Python Add que llame a la función C para hacerlo. El cuarto campo es la descripción de la función. Esta descripción se mostrará si está ayudando a esta función en Python.
Es equivalente a la descripción de la documentación de la función en Python. */
PyMODINIT_FUNC?initadd()?
{?
Py_InitModule("add",?addMethods);?
} ?
/* Tenga en cuenta que el nombre de esta función no se puede cambiar. Debe ser init + nombre del módulo. El nombre de nuestro módulo es agregar, por lo que esta función es initadd(). De esta manera, cuando Python importa un módulo con add, puede encontrar esta función y llamarla. Esta función llama a Py_InitModule para combinar el nombre del módulo con la tabla de mapeo. Dijo que el módulo agregar utiliza la tabla de mapeo addMethods. Python debería importar nuestro módulo de esta manera. Cree un nuevo setup.py con el siguiente contenido: from?distutils.core?import?setup,?Extension?
module1?=?Extension('add',?sources?=?['add. c'])?
setup?PackageName',?version?=?' 1.0',?description?=?'Este es un paquete de demostración',;ext_modules=?[module1])
Compilación: (especificé mingw32 porque mingw está instalado en mi máquina y el compilador predeterminado es vs2008. Referencia:
python setup.py build?compiler=mingw32
Cuándo ejecutado, se generará un directorio de compilación y un archivo en el directorio actual:
build\lib.win32-2.6\add.pyd
Copie add.pyd al directorio actual. escriba un archivo de prueba test.py, que contenga el siguiente código:
import add
print add.add(3,4)<
Ejecútelo, El resultado es 7
Bien, eso es básicamente
En Linux, la situación es un poco diferente
En otras palabras, use el archivo MAKE directamente. add.c se compila en .so y Python se puede importar directamente. El código del archivo MAKE es el siguiente: PYLIB?=?/usr/bin
PYINC?=?/usr/include/. python2.6
todos:?add.c
gcc?add.c?-g?-I$(PYINC)?-compartido?-L$(PYLIB)?- lpython2.6?-o?add.so
Limpiar:
rm?-f?add.so
Utilice el mismo código de prueba para probar p>