2009-10-17 145 views
5

我有一些Python函數可以讓我們更容易地使用Pygame進行遊戲開發。我把它們放在我的Python路徑中的helper.py文件中,這樣我就可以從我製作的任何遊戲中導入它們。我認爲,作爲學習Python擴展的練習,將此模塊轉換爲C。我的第一個問題是我需要使用Pygame中的函數,但我不確定這是否可行。 Pygame安裝了一些頭文件,但它們似乎沒有C函數的Python版本。也許我錯過了一些東西。製作需要另一個擴展名的Python的C擴展

我該如何解決這個問題?作爲一種解決方法,函數當前接受函數參數並調用該函數,但這不是理想的解決方案。順便說一下,使用Windows XP,Python 2.6和Pygame 1.9.1。

回答

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

你可以從C代碼中導入python模塊,並像在python代碼中那樣調用定義的東西。這有點長,但完全可能。

當我想弄清楚如何做這樣的事情時,我看看C API documentation。有關importing modules的部分將有所幫助。您還需要閱讀如何閱讀文檔中的屬性,調用函數等。

不過,我懷疑你真正想要做的是從調用C的underlying library sdl這是一個C庫,是很容易從C

使用

下面是一些示例代碼導入在C Python模塊改編自位pygame模塊工作代碼

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

大部分功能都只是圍繞SDL函數的包裝,那就是你要尋找它的功能C版。 pygame.h定義了一系列import_pygame_*()函數。在擴展模塊初始化時調用import_pygame_base()和其他一次,以訪問pygame模塊的C API所需的部分(它在每個頭文件中定義)。 Google代碼搜索會爲您帶來some examples