我在Python C API中掙扎了一番。我正在調用python方法在60Hz左右做一些AI遊戲。它的工作原理是,大部分是,但是每隔一秒左右,對PyEval_CallObject的調用就會產生一個NULL返回值。如果我正確地檢測到錯誤並繼續循環,那麼在接下來的一秒左右時間內都會很好,因此錯誤再次出現。PyEval_CallObject偶爾會在循環中失敗
我懷疑我做錯了什麼與裁判計數,但我無法弄清楚它是什麼:
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
{
我一直無法找出如何提取例外的是,無論是...沒有測試每例外
}
}
難道我甚至接近這樣做對嗎?就像我說的那樣,它大部分都可以工作,但我真的很想理解爲什麼我會遇到錯誤。
非常感謝您的幫助。
+1謝謝...我想如果我內聯Py_BuildValue的調用,它會照顧泄漏的引用,但也許不會。 我會看到PyErr_Fetch在pyErr_Occurred上給我什麼 – 2010-02-10 05:22:42
唉,C不是垃圾回收:) PyErr_Print()對於打印異常非常方便,特別是在調試像這樣的情況下。 – 2010-02-10 05:24:04
對於我而言,.NET環境下的時間太長了。 好吧奇怪。我添加了「sys.stdout = open('CONOUT $','wt')」到我的python腳本(輸出到控制檯...我在Win32中),一切都開始神奇地工作。離奇。 – 2010-02-10 05:34:25