小编Nic*_*man的帖子

PyEval_CallObject 偶尔在循环中失败

我在 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"));
Run Code Online (Sandbox Code Playgroud)

是的,我每次迭代都会导入模块。那有必要吗?如果我将 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
       {
Run Code Online (Sandbox Code Playgroud)

我还没有找到如何提取异常,或者......没有对 …

c python python-c-api

3
推荐指数
1
解决办法
1086
查看次数

标签 统计

c ×1

python ×1

python-c-api ×1