2009-10-17 3 views
5

Ho un paio di funzioni Python che uso per semplificare lo sviluppo del gioco con Pygame. Li ho in un file chiamato helper.py nel mio percorso Python, così posso importarli da qualsiasi gioco che faccio. Ho pensato, come esercizio per conoscere le estensioni Python, per convertire questo modulo in C. Il mio primo problema è che ho bisogno di usare le funzioni di Pygame, e non sono sicuro che sia possibile. Pygame installa alcuni file di intestazione, ma non sembrano avere versioni C delle funzioni Python. Forse mi manca qualcosa.Creazione di un'estensione C in Python che richiede un'altra estensione

Come posso risolvere questo? Come soluzione alternativa, la funzione attualmente accetta un parametro di funzione e lo chiama, ma non è la soluzione ideale.

Utilizzo di Windows XP, Python 2.6 e Pygame 1.9.1, a proposito.

risposta

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

È possibile importare i moduli Python dal codice C e chiamare le cose definite come nel codice Python. È un po 'lungo, ma perfettamente possibile.

Quando voglio capire come fare qualcosa di simile, guardo lo C API documentation. La sezione su importing modules aiuterà. Dovrai anche leggere come leggere gli attributi, chiamare le funzioni ecc. Che è tutto nei documenti.

Tuttavia ho il sospetto che si vuole veramente fare è chiamare il underlying library sdl da C. Questa è una libreria C ed è veramente facile da usare da C.

Ecco alcuni esempi di codice per importare un modulo Python in C Tratto da un po 'di codice funzionante

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

maggior parte delle funzioni nel modulo pygame sono solo wrapper attorno funzioni SDL, che è dove si deve guardare per la versione C delle sue funzioni. pygame.h definisce una serie di funzioni import_pygame_*(). Chiama import_pygame_base() e altri una volta al momento dell'inizializzazione del modulo di estensione per ottenere l'accesso alla parte necessaria dell'API C dei moduli pygame (è definita nel file di intestazione per ognuno). La ricerca del codice di Google ti porterà a some examples.