2009-10-17 16 views
5

Tengo un par de funciones de Python que utilizo para facilitar el desarrollo del juego con Pygame. Los tengo en un archivo llamado helper.py en mi ruta Python, así que puedo importarlos de cualquier juego que haga. Pensé, como un ejercicio para aprender acerca de las extensiones de Python, convertir este módulo en C. Mi primer problema es que necesito usar funciones de Pygame, y no estoy seguro si esto es posible. Pygame instala algunos archivos de encabezado, pero no parecen tener versiones C de las funciones de Python. Tal vez me estoy perdiendo algo.Haciendo una extensión C a Python que requiere otra extensión

¿Cómo puedo solucionar esto? Como solución temporal, la función actualmente acepta un parámetro de función y lo llama, pero no es la solución ideal.

Usando Windows XP, Python 2.6 y Pygame 1.9.1, por cierto.

Respuesta

6
/* get the sys.modules dictionary */ 
PyObject* sysmodules PyImport_GetModuleDict(); 
PyObject* pygame_module; 
if(PyMapping_HasKeyString(sysmodules, "pygame")) { 
    pygame_module = PyMapping_GetItemString(sysmodules, "pygame"); 
} else { 
    PyObject* initresult; 
    pygame_module = PyImport_ImportModule("pygame"); 
    if(!pygame_module) { 
     /* insert error handling here! and exit this function */ 
    } 
    initresult = PyObject_CallMethod(pygame_module, "init", NULL); 
    if(!initresult) { 
     /* more error handling &c */ 
    } 
    Py_DECREF(initresult); 
} 
/* use PyObject_CallMethod(pygame_module, ...) to your heart's contents */ 
/* and lastly, when done, don't forget, before you exit, to: */ 
Py_DECREF(pygame_module); 
3

Puede importar módulos de Python desde el código C y llamar a cosas definidas de la manera que pueda en el código python. Es un poco largo, pero perfectamente posible.

Cuando quiero averiguar cómo hacer algo como esto miro el C API documentation. La sección en importing modules ayudará. También deberá leer cómo leer atributos, llamar a funciones, etc., todo en los documentos.

Sin embargo, sospecho lo que realmente quiere hacer es llamar a la underlying library sdl de C. Esta es una biblioteca C y es muy fácil de usar desde C

Aquí hay un código de ejemplo para importar un módulo de Python en C adaptados de un poco de trabajo de código

PyObject *module = 0; 
PyObject *result = 0; 
PyObject *module_dict = 0; 
PyObject *func = 0; 

module = PyImport_ImportModule((char *)"pygame"); /* new ref */ 
if (module == 0) 
{ 
    PyErr_Print(); 
    log("Couldn't find python module pygame"); 
    goto out; 
} 
module_dict = PyModule_GetDict(module); /* borrowed */ 
if (module_dict == 0) 
{ 
    PyErr_Print(); 
    log("Couldn't find read python module pygame"); 
    goto out; 
} 
func = PyDict_GetItemString(module_dict, "pygame_function"); /* borrowed */ 
if (func == 0) 
{ 
    PyErr_Print(); 
    log("Couldn't find pygame.pygame_function"); 
    goto out; 
} 
result = PyEval_CallObject(func, NULL); /* new ref */ 
if (result == 0) 
{ 
    PyErr_Print(); 
    log("Couldn't run pygame.pygame_function"); 
    goto out; 
} 
/* do stuff with result */ 
out:; 
Py_XDECREF(result); 
Py_XDECREF(module); 
0

mayoría de las funciones en el módulo de pygame son sólo las envolturas alrededor de las funciones de SDL, que es donde hay que buscar la versión C de sus funciones. pygame.h define una serie de funciones import_pygame_*(). Llame al import_pygame_base() y otros una vez en la inicialización del módulo de extensión para obtener acceso a la parte necesaria de la API C de los módulos de pygame (está definido en el archivo de encabezado para cada uno). La búsqueda de código de Google le traerá some examples.

Cuestiones relacionadas