从C / C ++调用python方法,并提取其返回值

发布于 2021-01-29 14:55:45

我想从C中调用一个在python模块中定义的自定义函数。我有一些初步的代码可以做到这一点,但是它只是将输出打印到stdout。

mytest.py

import math

def myabs(x):
    return math.fabs(x)

测试文件

#include <Python.h>

int main() {
    Py_Initialize();
    PyRun_SimpleString("import sys; sys.path.append('.')");
    PyRun_SimpleString("import mytest;");
    PyRun_SimpleString("print mytest.myabs(2.0)");
    Py_Finalize();

    return 0;
}

如何将返回值提取到C double中并在C中使用它?

关注者
0
被浏览
172
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如前所述,使用PyRun_SimpleString似乎是个坏主意。

    您绝对应该使用C-
    API(http://docs.python.org/c-api/)提供的方法。

    阅读介绍是了解其工作方式的第一件事。

    首先,您必须了解PyObject,它是C API的基本对象。它可以代表任何类型的python基本类型(字符串,浮点数,整数,…)。

    存在许多函数,例如将python字符串转换为char *或PyFloat转换为double。

    首先,导入您的模块:

    PyObject* myModuleString = PyString_FromString((char*)"mytest");
    PyObject* myModule = PyImport_Import(myModuleString);
    

    然后获得对您的函数的引用:

    PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"myabs");
    PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(2.0));
    

    然后得到你的结果:

    PyObject* myResult = PyObject_CallObject(myFunction, args)
    

    回到双:

    double result = PyFloat_AsDouble(myResult);
    

    您显然应该检查错误(请参阅Mark Tolonen给出的链接)。

    如有任何疑问,请不要犹豫。祝好运。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看