2009-10-17 3 views
5

파이 게임을 사용하여 게임 개발을 쉽게하는 데 사용하는 몇 가지 파이썬 함수가 있습니다. 필자는 Python 경로에 helper.py라는 파일을 가지고 있기 때문에 내가 만든 모든 게임에서 가져올 수 있습니다. 이 모듈을 C로 변환하기위한 파이썬 확장 기능에 대해 배울 수있는 연습으로 생각했습니다. 첫 번째 문제는 파이 게임에서 함수를 사용해야한다는 것입니다. 이것이 가능한지 확실하지 않습니다. 파이 게임은 일부 헤더 파일을 설치하지만 파이썬 함수의 C 버전은없는 것 같습니다. 어쩌면 내가 뭔가를 놓친 것 같아.다른 확장자가 필요한 파이썬 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 코드에서 가져 와서 정의 된 것을 호출 할 수 있습니다. 조금 길어졌지만 완벽하게 가능합니다.

내가 이런 식으로 일하는 방법을 알고 싶을 때 나는 C API documentation을 봅니다. importing modules 섹션이 도움이 될 것입니다. 속성을 읽는 방법, 문서에있는 함수를 호출하는 방법 등을 읽어야합니다.

그러나 나는 당신이 정말 이것은 C 라이브러리와 C

에서 다음

을 정말 사용하기 쉬운 C.에서 underlying library sdl를 호출되어 수행 할 작업을 의심하는 것은 C에서 파이썬 모듈을 가져올 수있는 몇 가지 예제 코드 당신이 그 기능의 C 버전을 찾기 위해이 곳 SDL 기능의 주위에 단지 래퍼가 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

대부분의 기능을 작업의 비트 출신 적응, 즉. pygame.h은 일련의 import_pygame_*() 함수를 정의합니다. import_pygame_base() 등으로 확장 모듈 초기화시 한번 호출하여 파이 게임 모듈의 C API의 필요한 부분에 접근 할 수 있습니다. (각 헤더 파일에 정의되어 있습니다). Google 코드 검색을 사용하면 some examples이 표시됩니다.