2009-10-17 2 views
5

У меня есть пара функций Python, которые я использую, чтобы упростить разработку игры с Pygame. Я имею их в файле helper.py в моем Python-пути, поэтому я могу импортировать их из любой игры, которую я делаю. Я думал, как упражнение узнать о расширениях Python, чтобы преобразовать этот модуль в C. Моя первая проблема заключается в том, что мне нужно использовать функции Pygame, и я не уверен, что это возможно. Pygame устанавливает некоторые файлы заголовков, но у них, похоже, нет версий C функций Python. Может быть, я что-то упустил.Создание расширения C для Python, для которого требуется другое расширение

Как я могу это решить? В качестве обходного пути функция в настоящее время принимает параметр функции и вызывает это, но это не идеальное решение.

Использование 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

Вы можете импортировать модули python из кода C и вызывать вещи, определенные так же, как вы можете в коде python. Он немного длинный, но вполне возможен.

Когда я хочу разобраться, как это сделать, я смотрю на C API documentation. Раздел по importing modules поможет. Вам также нужно будет прочитать, как читать атрибуты, функции вызова и т. Д., Которые находятся в документах.

Однако я подозреваю, что вы действительно хотите сделать, это вызвать underlying library sdl из C. Это библиотека C и очень проста в использовании из C.

Вот некоторые примеры кода, чтобы импортировать модуль питона в C адаптировано из бита рабочего кода

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

Большинство функций в pygame модуле являются только обертками вокруг SDL функций, то есть, где вы должны искать для версии C его функций. pygame.h определяет ряд функций import_pygame_*(). Вызовите import_pygame_base() и другие при инициализации модуля расширения, чтобы получить доступ к необходимой части C API модулей pygame (он определен в файле заголовка для каждого). Поиск кода Google приведет вас к some examples.

Смежные вопросы