Cómo hacer que Python llame a C y código C
Para entender cómo hacer que Python llame al código C/C (es decir, escribir una extensión de Python), debes conquistar la sección gruesa del capítulo del manual. Después de pasar una hora ayer, estaba mareado y todavía no sabía cómo escribir una extensión de Python. Revisé algunos otros libros y finalmente encontré un tutorial en el libro "Programación de Python en Win32".
1. Lo primero que debe comprender es que la llamada extensión de Python (es decir, el código c/c que proporciona a Python no es necesariamente un código c/c, puede ser un código escrito en otros idiomas) es un dll, y este dll se coloca en el directorio DLL en el directorio de instalación local de Python (por ejemplo, la ruta en mi máquina es: F:/Program Files/Python25/DLLs si el módulo de extensión que queremos). a escribir a continuación se llama mb. El código llamado por Python es: import mbmb.showMsg("Python es realmente asombroso, ¡me encanta!")
2. Archivo de encabezado c y biblioteca lib proporcionada por Python para expandir el desarrollo.
En vs 2005, haga clic en el menú "Herramientas"->"Opciones", abra el cuadro de diálogo de opciones, seleccione "Proyectos y soluciones->Directorio VC" y luego "muestre el directorio con el siguiente contenido a la derecha" "Seleccione "Incluir archivos" en el cuadro combinado, agregue el directorio de inclusión de Python (en mi máquina es "F:/Archivos de programa/Python25/include"), luego seleccione el archivo de la biblioteca y agregue el directorio libs de Python (en mi máquina es "F:/Program Files/Python25/include") "F:/Program Files/Python25/libs").
Dado que la extensión es una dll, a continuación debemos crear un proyecto de "biblioteca de vínculos dinámicos" y luego comenzar a escribir el código:
#include lt; python.h es un archivo de encabezado que contiene algunas definiciones de python, en el directorio de inclusión de python /* Mi versión de python es 2.5, porque no proporciona el archivo de biblioteca lib bajo depuración después de instalar python, por lo que debe generar la versión de lanzamiento de el dll, p>
Si desea generar la versión dll, debe ir al sitio web oficial de Python para descargar el código fuente de Python usted mismo. Por supuesto, puede continuar generando la versión de lanzamiento del dll. , pero el dll contiene información de depuración*/#pragma comment(lib, " python25.lib")//Ignorar PyObject estático* mb_showMsg(PyObject* self, PyObject *args);/*Si su extensión es mb, debe implementar un función initmb y exportar esta función desde la dll, pero estamos Al llamar a import mb en python, python irá a la dll para llamar a
extern "C" __declspec(dllexport) void initmb(){/* Al llamar a mb.showMsg ("Python es realmente asombroso, ¡me encanta!"), es equivalente a decirle a Python que tengo una función showMsg. ¿Cómo le decimos a Python que llame a la función mb_showMsg en nuestro dll? El truco es el siguiente: defina una estructura de datos de diccionario, key =gt; showMsg, value =gt; mb_showMsg, METH_VARARGS son métodos de llamada de funciones, consulte el manual cuidadosamente */static PyMethodDef mbMethods[] = {
{"showMsg", mb_showMsg, METH_VARARGS},
{NULL, NULL, NULL} /*sentinel, centinela, usado para marcar el final*/} //Dile a Python que nuestro módulo se llama mb; , module Las funciones incluidas están todas en el diccionario mbMethods
PyObject *m = Py_InitModule("mb", mbMethods);}/*A continuación, implementamos la función principal showMsg*///No Necesito el primer parámetro self. Consulte el manual específicamente. El segundo parámetro es el parámetro que nos pasó Python. Es una tupla de parámetros de Python
PyObject* mb_showMsg(PyObject* self, PyObject *args){. //Nuestra función showMsg Lo que se necesita es un parámetro de cadena
const char* msg = NULL; /* Llame al parámetro especial para decodificar el parámetro que nos pasó python s es una cadena. dirección variable del parámetro recibido,
Si su función funcional requiere dos parámetros, continúe agregando la dirección variable que acepta los parámetros después de PyArg_parseTuple.
El prototipo de esta función está en el forma de un parámetro indefinido similar a printf
PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); )
p>
return NULL; //Llamar a MBint r = ::MessageBox(NULL, "hello", "Caption: Form C module", MB_ICONINFORMATION | MB_OK); //Valor de retorno return Py_BuildValue("i", r) ;} Copie el código anterior mezclado con muchos comentarios en su editor, luego compílelo para generar mb.dll, modifique el sufijo a mb.pyd, luego cópielo en el directorio de archivos DLL de Python y abra inactivo (el programa interactivo de Python) , escribe el código: import mbmb.showMsg("Python es realmente asombroso, ¡me encanta!")