【发布时间】:2010-02-10 05:07:11
【问题描述】:
我在使用 Python C API 时有些吃力。我正在调用 python 方法以大约 60hz 做一些游戏 AI。它在大多数的时间里工作,但每隔一秒左右对 PyEval_CallObject 的调用就会产生一个 NULL 返回值。如果我正确检测到错误并继续循环,则下一秒左右一切正常,然后错误再次发生。
我怀疑我在引用计数方面做错了,但我不知道它是什么:
int script_do_ai(struct game_data_t* gd)
{
PyObject *pAiModule, *pResult;
float result=0.0;
pResult = NULL;
pAiModule = PyImport_Import(PyString_FromString("ai_script"));
是的,我每次迭代都会导入模块。那有必要吗?如果我将 pAiModule 存储为全局,大约一秒钟后我会遇到严重崩溃。
pResult = PyEval_CallObject(PyObject_GetAttrString(pAiModule, "do_ai"),
Py_BuildValue("f", gd->important_float))
if (pResult != NULL)
{
PyArg_Parse(pResult, "f", &result);
Py_DECREF(pResult);
ConquerEnemies(result); //you get the idea
}
else //this happens every 75 or so iterations thru the loop
{
if (PyErr_ExceptionMatches(PyExc_SomeException)) //? not sure what to do here
{
我还没有找到如何提取异常,要么...没有测试每个异常
}
}
我什至接近做到这一点吗?就像我说的那样,它大部分都有效,但我真的很想了解为什么我会出错。
提前感谢您的帮助。
【问题讨论】:
标签: python c python-c-api