我写了一些C代码来调用scipy函数。正文包括变量声明和使用EXIT FAIL来表示消息和清理步骤:
PyObject *module_name, *module = NULL;
PyObject *funct = NULL;
PyObject *output = NULL;
int j;
double dInVal, dOutVal;
Py_Initialize();
module_name = PyString_FromString("scipy.stats");
module = PyImport_Import(module_name);
Py_DECREF(module_name);
if (!module)
EXIT FAIL
funct = PyObject_GetAttrString(module, "beta");
if (!funct)
EXIT FAIL
Py_DECREF(module);
for (j=0; j<=10; j++)
{
dInVal = (double)j/10.0;
output = PyObject_CallMethod(funct, "ppf", "(f,f,f)", dInVal, 50.0, 50.0);
if (!output)
EXIT FAIL
dOutVal = PyFloat_AsDouble(output);
Py_DECREF(output);
printf("%6.3f %6.3f\n", dInVal, dOutVal);
}
Py_DECREF(funct);
Py_Finalize();
当我将此作为主程序运行时,它似乎工作正常。但是,当我将其作为子例程运行时,它适用于第一次调用,但在任何后续调用时都会失败。
如果我将所有PyObject
指针设为静态(并包含相应的标志,以便初始化Python并且“beta”对象仅导入一次),则代码在第一次调用后作为子例程工作),但make-everything-static似乎是解决问题的一种强力解决方案,特别是如果程序最终会包含多个调用Python的子程序。
我的问题是,设置C程序的最佳做法是什么,从子程序调用scipy?