从C语言调用Scipy的最佳实践

2024-04-19 22:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一些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”对象只被导入一次),那么代码确实可以作为一个子例程来工作,但是将所有东西都设置为静态似乎是解决问题的强力解决方案,特别是如果程序最终将包含多个调用Python的子例程。你知道吗

我的问题是,设置C程序的最佳实践是什么,从子程序调用scipy?你知道吗


Tags: namepyoutputifexitscipy例程null