C 语言调用 Python 代码
C 语言调用 Python 代码
在 C 语言中使用某个 Python 函数
// 使用到的 python 的 C API 的头文件
#include <Python.h>
#include <stdlib.h>int main(int argc, char**argv)
{// 获取 python 虚拟机的全局锁Py_Initialize();// 调用一条简单的 python 语句PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append(\"./\")");// 从文件系统中获取 python 文件的名字 multiply.py,生成一个 python 字符串PyObject *pName = PyUnicode_DecodeFSDefault("multiply");// 导入该 python 对应的文件,形成一个模块PyObject *pModule = PyImport_Import(pName);if(!pModule){fprintf(stderr, "cannot find module");return -1;}// 从模块中导入指定的函数PyObject *pFunc = PyObject_GetAttrString(pModule, "multiply");// 不再使用 pMoudle 变量,这里将其空间释放,Py_DECREF() 函数实际作用是减少对该变量的引用计数Py_DECREF(pModule);if(!pFunc){fprintf(stderr, "cannot find function");return -1;}// 检查 pFunc 是否可以被执行if(!PyCallable_Check(pFunc)){fprintf(stderr, "function check failed");return -1;}// 将函数需要的参数生成一个元组,"(dd)" 是格式化字符串,'d' 表示双精度浮点数PyObject *pArgs = Py_BuildValue("(dd)", 2.0, 3.0);// 调用函数 pFunc 和 参数 pArgs 进行处理PyObject *result = PyObject_CallObject(pFunc, pArgs);Py_DECREF(pArgs);// 将从 python 得到返回值转化成 C 语言的类型double retval = PyFloat_AsDouble(result);Py_DECREF(result);fprintf(stderr, "retval is %f", retval);// 释放 python 解释器的全局锁Py_Finalize();return 0;}
def multiply(a,b):print("Will compute", a, "times", b)c = a * bprint("the result is ", c)return c
参考文档
调用协议
解析参数并构建值变量