2009-10-17 12 views
5

J'ai quelques fonctions Python que j'utilise pour faciliter le développement de jeux avec Pygame. Je les ai dans un fichier appelé helper.py dans mon chemin Python, donc je peux les importer de n'importe quel jeu que je fais. Je pensais, comme un exercice pour en apprendre davantage sur les extensions Python, pour convertir ce module en C. Mon premier problème est que j'ai besoin d'utiliser des fonctions de Pygame, et je ne suis pas sûr si cela est possible. Pygame installe certains fichiers d'en-tête, mais ils ne semblent pas avoir les versions C des fonctions Python. Peut-être qu'il me manque quelque chose.Création d'une extension C vers Python nécessitant une autre extension

Comment puis-je résoudre ce problème? Pour contourner ce problème, la fonction accepte actuellement un paramètre de fonction et l'appelle, mais ce n'est pas la solution idéale. En passant, Windows XP, Python 2.6 et Pygame 1.9.1.

Répondre

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

Vous pouvez importer des modules python à partir du code C et appeler les éléments définis comme vous pouvez le faire en code python. C'est un peu long, mais parfaitement possible.

Lorsque je veux savoir comment faire quelque chose comme ça, je regarde le C API documentation. La section sur importing modules aidera. Vous aurez également besoin de lire comment lire les attributs, les fonctions d'appel, etc., qui sont tous dans les docs.

Cependant je soupçonne que ce que vous voulez vraiment faire est d'appeler la underlying library sdl de C. Ceci est une bibliothèque C et est vraiment facile à utiliser de C.

Voici quelques exemples de code pour importer un module python en C adapté d'un peu de code de travail

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

la plupart des fonctions dans le module pygame ne sont que des emballages autour des fonctions SDL, qui est l'endroit où vous devez chercher la version C de ses fonctions. pygame.h définit une série de import_pygame_*() fonctions. Appelez import_pygame_base() et d'autres une fois lors de l'initialisation du module d'extension pour avoir accès à la partie nécessaire de l'API C des modules pygame (elle est définie dans le fichier d'en-tête pour chacun). La recherche de code Google vous apportera some examples.