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 * b
    print("the result is ", c)
    return c

参考文档

调用协议

解析参数并构建值变量

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值