我在 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
{
我还没能找到如何提取异常,要么......没有测试每个异常
}
}
我什至接近做到这一点吗?就像我说的,它主要是有效的,但我真的很想了解为什么我会出错。
预先感谢您的任何帮助。