Requisito previo: API de C del módulo de extensión en Python | Serie 1
Veamos un ejemplo de un nuevo módulo de extensión que carga y usa estas funciones API que desarrollamos en el artículo anterior.
Código #1:
#include "pythonsample.h" /* An extension function that uses the exported API */ static PyObject *print_point(PyObject *self, PyObject *args) { PyObject *obj; Point *p; if (!PyArg_ParseTuple(args, "O", &obj)) { return NULL; } /* Note: This is defined in a different module */ p = PyPoint_AsPoint(obj); if (!p) { return NULL; } printf("%f %f\n", p->x, p->y); return Py_BuildValue(""); } static PyMethodDef PtExampleMethods[] = { {"print_point", print_point, METH_VARARGS, "output a point"}, { NULL, NULL, 0, NULL} }; static struct PyModuleDef ptexamplemodule = { PyModuleDef_HEAD_INIT, /* name of module */ "ptexample", /* Doc string (may be NULL) */ "A module that imports an API", /* Size of per-interpreter state or -1 */ -1, /* Method table */ PtExampleMethods };
Código #2: función de inicialización del módulo
PyMODINIT_FUNC PyInit_ptexample(void) { PyObject *m; m = PyModule_Create(&ptexamplemodule); if (m == NULL) return NULL; /* Import sample, loading its API functions */ if (!import_sample()) { return NULL; } return m; }
Ahora, para compilar este nuevo módulo, no es necesario preocuparse por cómo vincularse con cualquiera de las bibliotecas o el código del otro módulo. Uno puede simplemente usar work.py
el archivo como se muestra a continuación.
Código #3:
# setup.py from distutils.core import setup, Extension # May need pythonsample.h directory setup(name ='ptexample', ext_modules = [ Extension('ptexample', ['ptexample.c'], include_dirs = [], )])
Después de realizar toda esta tarea, esta nueva función de extensión funciona perfectamente con las funciones de la API de C definidas en el otro módulo.
Código #4: Uso de las funciones de la API de CPI definidas en el otro módulo
import ptexample import work point1 = work.Point(2, 3) print ("Point_1 : ", point1) print ("\n", ptexample.print_point(p1))
Producción :
Point_1 : 2.000000 3.000000
Publicación traducida automáticamente
Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA