当前位置: 首页 > news >正文

C语言调用Python

目录

1.直接调用python语句

头文件引用 

2.调用无参有参函数

1、调用无参函数

1.建立nopara.py文件

 2.使用c语言根据上面流程进行调用

2、调用有参函数 

1.建立nopara.py文件

 2.使用c语言根据上面流程进行调用


C语言调用python需要我们已经安装好了libpython3 dev依赖库,如果还没安装的可以看我之前的文档搭建python编译环境-CSDN博客

1.直接调用python语句

  • 头文件Python.h,这是Python API的头文件,用于访问Python对象和函数
  • Py_Initialize();函数初始化Python解释器
  • PyRun_SimpleString();函数可以执行一段简单的Python代码,例如打印"funny"。需要传递一个字 符串作为参数,表示要执行的Python代码,print ('funny')这么一个Python代码字符串。
  • Py_Finalize()函数关闭Python解释器,并释放资源。
#include "Python.h"
int main()
{Py_Initialize(); // 初始化PyRun_SimpleString("print ('happy')");Py_Finalize(); //释放资源
}

运行这个程序我们要使用以下命令进行编译(我的python版本是Python 3.10) 

gcc simpledemo.c -o simpledemo -I /usr/include/python3.10 -lpython3.10//编译
./simpledemo//运行

头文件引用 

/usr/include :Linux系统编程往往需要引用c头文件,linux下,头文件一般存储到/usr/include 

若头文件在此文件夹内,相对路径直接引入即可

#include<stdio.h>
#include<netient/ip.h>

若在其他文件夹,gcc编译需要声明-I指定路径 

gcc -I /usr/xxx/include yyy.c

 运行结果

2.调用无参有参函数

关于sys.path的用法及介绍可以看这篇博文

sys.path用法介绍-CSDN博客

1、调用无参函数

  1. 包含Python.h头文件,以便使用Python API
  2. 使用void Py_Initialize()初始化Python解释器,
  3. 使用PyObject *PyImport_ImportModule(const char *name)PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用 int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载当前的Python模块(Python文件即python模块) 
  4. 使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否有错误。
  5. 使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取 Python函数对象,并检查是否可调用。
  6. 使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用 Python函数,并获取返回值。
  7. 使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
  8. 结束时调用void Py_Finalize()函数关闭Python解释器。

第三步可以改成这两句获取sys.path对象和添加当前路径到sys.path中

    PyRun_SimpleString("import sys");

    PyRun_SimpleString("sys.path.append('./')");

1.建立nopara.py文件
#nopara.py文件
def say_funny():print('funny')
 2.使用c语言根据上面流程进行调用
#include <Python.h>int main(){Py_Initialize();//初始化python解释器,他会加载我们python的编译环境PyObject *pyob = PyImport_ImportModule("sys");//获取sys模块PyObject *list = PyObject_GetAttrString(pyob,"path");//获取sys.path对象PyList_Append(list,PyUnicode_FromString("."));//将当前路径添加到sys.path中PyObject *mode = PyImport_ImportModule("nopara");//导入python模块,就是导入要执行的python文件if(!mode){PyErr_Print();printf("ERROR:mode not!\n");}PyObject *pFunc = PyObject_GetAttrString(mode,"say_funny");if(!pFunc|| !PyCallable_Check(pFunc)){PyErr_Print();printf("ERROR:pFunc not!\n");}PyObject *pValue = PyObject_CallObject(pFunc,NULL);if(!pValue){PyErr_Print();printf("ERROR:pValue not!\n");}Py_DECREF(pValue);Py_DECREF(pFunc);Py_DECREF(mode);Py_Finalize();return 0;
}

2、调用有参函数 

其实调用有参函数与无参函数的区别只在我们有没有传参,如果有返回值我们就需要获取返回值

  1. 包含Python.h头文件,以便使用Python API
  2. 使用void Py_Initialize()初始化Python解释器,
  3. 使用PyObject *PyImport_ImportModule(const char *name)PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)获取sys.path对象,并利用 int PyList_Append(PyObject *list, PyObject *item)将当前路径.添加到sys.path中,以便加载 当前的Python模块(Python文件即python模块)
  4. 使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否有错误。
  5. 使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取 Python函数对象,并检查是否可调用。
  6. 使用PyObject *Py_BuildValue(const char *format, ...)函数将C类型的数据结构转换成 Python对象,作为Python函数的参数,没有参数不需要调用
  7. 使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用 Python函数,并获取返回值。
  8. 使用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类 型,并检查是否有错误,没有返回值时不需要调用。
  9. 使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
  10. 结束时调用void Py_Finalize()函数关闭Python解释器。

第三步也可以自行更改

1.建立nopara.py文件
#nopara.py文件
def say_funny(category):print(category)return category
 2.使用c语言根据上面流程进行调用
int main(){Py_Initialize();//初始化python解释器,他会加载我们python的编译环境// PyObject *pyob = PyImport_ImportModule("sys");//获取sys模块// PyObject *list = PyObject_GetAttrString(pyob,"path");//获取sys.path对象// PyList_Append(list,PyUnicode_FromString("."));//将当前路径添加到sys.path中PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");PyObject *mode = PyImport_ImportModule("nopara");//导入python模块,就是导入要执行的python文件if(!mode){PyErr_Print();printf("ERROR:mode not!\n");}//获取python函数对象,并检查是否可被调用PyObject *pFunc = PyObject_GetAttrString(mode,"say_funny");if(!pFunc|| !PyCallable_Check(pFunc)){PyErr_Print();printf("ERROR:pFunc not!\n");}char *p = "happy day!!!";PyObject* pArgs = Py_BuildValue("(s)",p);//调用python函数,并获取其返回值,就是执行那个函数PyObject *pValue = PyObject_CallObject(pFunc,pArgs);if(!pValue){PyErr_Print();printf("ERROR:pValue not!\n");}char *result = NULL;if (!PyArg_Parse(pValue, "s", &result)){PyErr_Print();printf("Error: parse failed\n");}printf("c=%s\n",result);//释放所有引用的python对象Py_DECREF(pValue);Py_DECREF(pFunc);Py_DECREF(mode);//关闭python解释器Py_Finalize();return 0;
}

 使用以下代码进行编译运行

 gcc -o pymode02_2 pymode02.c -I /usr/include/python3.10/ -lpython3.10sudo ./pymode02_2 

运行结果 

http://www.lryc.cn/news/336423.html

相关文章:

  • SVN客户端异常问题处理
  • gin+sse实现离散的消息通知
  • C++ //练习 11.38 用unordered_map重写单词计数程序(参见11.1节,第375页)和单词转换程序(参见11.3.6节,第391页)。
  • 【示例】MySQL-4类SQL语言-DDL-DML-DQL-DCL
  • 基于SpringBoot+Vue的果蔬种植销售一体化服务平台(源码+文档+部署+讲解)
  • 数据结构面试
  • Linux 上安装 SQLite
  • C++模板初阶(个人笔记)
  • 如何用Java后端处理JS.XHR请求
  • 分布式锁-redission
  • C/C++ 自定义头文件,及头文件结构详解
  • 快速列表quicklist
  • 《MATLAB科研绘图与学术图表绘制从入门到精通》
  • Day3-struct类型、列转行、行转列、函数
  • C++设计模式:构建器模式(九)
  • OJ 【难度1】【Python】完美字符串 扫雷 A-B数对 赛前准备 【C】精密计时
  • 【Tars-go】腾讯微服务框架学习使用01--初始化服务
  • 通过pre标签进行json格式化展示,并实现搜索高亮和通过鼠标进行逐个定位的功能
  • 5分钟了解清楚【osgb】格式的倾斜摄影数据metadata.xml有几种规范
  • CCIE-10-IPv6-TS
  • 《QT实用小工具·十七》密钥生成工具
  • CSP 比赛经验分享
  • 探究“大模型+机器人”的现状和未来
  • Commitizen:规范化你的 Git 提交信息
  • 官网下载IDE插件并导入IDE
  • 三行命令解决Ubuntu Linux联网问题
  • AI大模型在自然语言处理中的应用:性能表现和未来趋势
  • 三防平板定制服务:亿道信息与个性化生产的紧密结合
  • 【备战蓝桥杯】2024蓝桥杯赛前突击省一:基础数论篇
  • golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新