Python C API で少し苦労しています。約 60hz でゲーム AI を実行するために Python メソッドを呼び出しています。ほとんどの場合は機能しますが、1 秒おきに PyEval_CallObject を呼び出すと、戻り値が NULL になります。エラーを正しく検出してループを続行すると、次の 1 秒ほどは問題なく動作しますが、エラーが再び発生します。
私は参照カウントで何か間違ったことをしていると思いますが、それが何であるかわかりません:
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 をグローバルとして保存すると、約 1 秒後にハード クラッシュが発生します。
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
{
私はまだ例外を抽出する方法を見つけることができませんでした...すべての例外をテストすることなく
}
}
私はこれを正しく行うことに近づいていますか?私が言ったように、それはほとんど動作しますが、エラーが発生する理由を本当に理解したいです.
よろしくお願いします。