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、调用无参函数
- 包含Python.h头文件,以便使用Python API。
- 使用void Py_Initialize()初始化Python解释器,
- 使用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模块)。
- 使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否有错误。
- 使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取 Python函数对象,并检查是否可调用。
- 使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用 Python函数,并获取返回值。
- 使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
- 结束时调用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、调用有参函数
其实调用有参函数与无参函数的区别只在我们有没有传参,如果有返回值我们就需要获取返回值
- 包含Python.h头文件,以便使用Python API。
- 使用void Py_Initialize()初始化Python解释器,
- 使用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模块)。
- 使用PyObject *PyImport_ImportModule(const char *name)函数导入Python模块,并检查是否有错误。
- 使用PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)函数获取 Python函数对象,并检查是否可调用。
- 使用PyObject *Py_BuildValue(const char *format, ...)函数将C类型的数据结构转换成 Python对象,作为Python函数的参数,没有参数不需要调用
- 使用PyObject *PyObject_CallObject(PyObject *callable, PyObject *args)函数调用 Python函数,并获取返回值。
- 使用int PyArg_Parse(PyObject *args, const char *format, ...)函数将返回值转换为C类 型,并检查是否有错误,没有返回值时不需要调用。
- 使用void Py_DECREF(PyObject *o)函数释放所有引用的Python对象。
- 结束时调用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
运行结果
相关文章:

C语言调用Python
目录 1.直接调用python语句 头文件引用 2.调用无参有参函数 1、调用无参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 2、调用有参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 C语言调用python需要我们已经安装好了libpython3的 dev依赖…...

SVN客户端异常问题处理
1、如遇svn服务端异常(所有用户登录不上) (1)登录192.168.**.**服务器,找到E:\仓库所在盘\VisualSVN-GlobalWinAuthz.ini (2)先备份VisualSVN-GlobalWinAuthz.ini文件 (3…...

gin+sse实现离散的消息通知
虽然网上的都是用sse实现将实时消息流不间断的推给前端,但是sse也可以模拟websocket进行突发的消息通知,而不是一直读取数据并返回数据。即服务端保存所有的连接对象,前端管理界面发送正常的http请求,在后端遍历所有的连接对象&am…...

C++ //练习 11.38 用unordered_map重写单词计数程序(参见11.1节,第375页)和单词转换程序(参见11.3.6节,第391页)。
C Primer(第5版) 练习 11.38 练习 11.38 用unordered_map重写单词计数程序(参见11.1节,第375页)和单词转换程序(参见11.3.6节,第391页)。 环境:Linux Ubuntu࿰…...

【示例】MySQL-4类SQL语言-DDL-DML-DQL-DCL
前言 本文主要讲述MySQL中4中SQL语言的使用及各自特点。 SQL语言总共分四类:DDL、DML、DQL、DCL。 SQL-DDL | Data Definition Language 数据定义语言:用来定义/更改数据库对象(数据库、表、字段) 用途 | 操作数据库 # 查询所…...

基于SpringBoot+Vue的果蔬种植销售一体化服务平台(源码+文档+部署+讲解)
一.系统概述 伴随着我国社会的发展,人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体…...

数据结构面试
当然可以!以下是数据结构面试问题及答案整理: **什么是数据结构?** 答:数据结构是指组织和存储数据的方式,它允许高效地访问和操作数据。不同的数据结构有不同的优势和适用场景。常见的基本数据结构包括数组、链表、…...

Linux 上安装 SQLite
SQLite Download Page 从上面的链接中源代码区下载 sqlite-autoconf-*.tar.gz。 历史版本见下连接: https://sqlite.org/chronology.html...

C++模板初阶(个人笔记)
模板初阶 1.泛型编程2.函数模板2.1函数模板的实例化2.2模板参数的匹配规则 3.类模板3.1类模板的实例化 1.泛型编程 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 //函数重载 //交换函数的逻辑是一致的,…...

如何用Java后端处理JS.XHR请求
Touching searching engine destroies dream to utilize php in tomcat vector.The brave isn’t knocked down,turn its path to java back-end. Java Servlet Bible schematic of interaction between JS front-end and Java back-end Question 如何利用Java…...

分布式锁-redission
5、分布式锁-redission 5.1 分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码…...

C/C++ 自定义头文件,及头文件结构详解
头文件 在之前介绍的大部分C语言语法基础的章节中列举的实例代码部分,都会在源文件的开始的第一行通过#include预处理指令包含进"stdio.h",后面这个".h"后缀名的就是头文件了。而什么是头文件呢? 通俗方式理解头文件 …...

快速列表quicklist
目录 为什么使用快速列表quicklist 对比双向链表 对比压缩列表ziplist quicklist结构 节点结构quicklistNode quicklist 管理ziplist信息的结构quicklistEntry 迭代器结构quicklistIter quicklist的API 1.创建快速列表 2.创建快速列表节点 3.头插quicklistPushHead …...

《MATLAB科研绘图与学术图表绘制从入门到精通》
解锁MATLAB科研绘图魅力,让数据可视化成为你的科研利器! 1.零基础快速入门:软件操作实战案例图文、代码结合讲解,从入门到精通快速高效。 2.多种科研绘图方法:科研绘图基础变量图形极坐标图形3D图形地理信息可视化等&a…...

Day3-struct类型、列转行、行转列、函数
Hive 数据类型 struct类型 struct:结构体,对应了Java中的对象,实际上是将数据以json形式来进行存储和处理 案例 原始数据 a tom,19,male amy,18,female b bob,18,male john,18,male c lucy,19,female lily,19,female d henry,18,male davi…...

C++设计模式:构建器模式(九)
1、定义与动机 定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化) 动机: 在软件系统中,有时候面临着“一个复杂对象”的创建工作&#x…...

OJ 【难度1】【Python】完美字符串 扫雷 A-B数对 赛前准备 【C】精密计时
完美字符串 题目描述 你可能见过下面这一句英文: "The quick brown fox jumps over the lazy dog." 短短的一句话就包含了所有 2626 个英文字母!因此这句话广泛地用于字体效果的展示。更短的还有: "The five boxing wizards…...

【Tars-go】腾讯微服务框架学习使用01--初始化服务
1 初始INIT-Demo运行 按照官网描述 go get 安装框架依赖 # < go 1.16 go get -u github.com/TarsCloud/TarsGo/tars/tools/tarsgo go get -u github.com/TarsCloud/TarsGo/tars/tools/tars2go # > go 1.16 go install github.com/TarsCloud/TarsGo/tars/tools/tarsgolat…...

通过pre标签进行json格式化展示,并实现搜索高亮和通过鼠标进行逐个定位的功能
功能说明 实现一个对json进行格式化的功能添加搜索框,回车进行关键词搜索,并对关键词高亮显示搜索到的多个关键词,回车逐一匹配监听json框,如果发生了编辑,需要在退出时提示,在得到用户确认的情况下再退出…...

5分钟了解清楚【osgb】格式的倾斜摄影数据metadata.xml有几种规范
数据格式同样都是osgb,不同软件生产的,建模是参数不一样,还是有很大区别的。尤其在应用阶段。 本文从建模软件、数据组织结构、metadata.xml(投影信息)、应用几个方面进行了经验性总结。不论您是初步开始建模…...

CCIE-10-IPv6-TS
目录 实验条件网络拓朴 环境配置开始Troubleshooting问题1. R25和R22邻居关系没有建立问题2. 去往R25网络的下一跳地址不存在、不可用问题3. 去往目标网络的下一跳地址不存在、不可用 实验条件 网络拓朴 环境配置 在我的资源里可以下载(就在这篇文章的开头也可以下…...

《QT实用小工具·十七》密钥生成工具
1、概述 源码放在文章末尾 该项目主要用于生成密钥,下面是demo演示: 项目部分代码如下: #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…...

CSP 比赛经验分享
中国软件专业技术资格(水平)考试( CSP-S )是一项旨在评价软件和信息技术 专业人员专业技术水平的考试。对于参加过 CSP 比赛的人来说,这是一个展示 自己编程能力、逻辑思维和解决问题能力的好机会。下面是一些基于…...

探究“大模型+机器人”的现状和未来
基础模型(Foundation Models)是近年来人工智能领域的重要突破,在自然语言处理和计算机视觉等领域取得了显著成果。将基础模型引入机器人学,有望从感知、决策和控制等方面提升机器人系统的性能,推动机器人学的发展。由斯坦福大学、普林斯顿大学…...

Commitizen:规范化你的 Git 提交信息
简介 在团队协作开发过程中,规范化的 Git 提交信息可以提高代码维护的效率,便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具,它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…...

官网下载IDE插件并导入IDE
官网下载IDEA插件并导入IDEA 1. 下载插件2. 导入插件 1. 下载插件 地址:https://plugins.jetbrains.com/plugin/21068-codearts-snap/versions 说明:本次演示以IDEA软件为例 操作: 等待下载完成 2. 导入插件 点击File->setting->Pl…...

三行命令解决Ubuntu Linux联网问题
本博客中Ubuntu版本为23.10.1最新版本,后续发现了很多问题我无法解决,已经下载了另外一个版本22.04,此版本自带网络 一开始我找到官方文档描述可以通过命令行连接到 WiFi 网络:https://cn.linux-console.net/?p10334#google_vig…...

AI大模型在自然语言处理中的应用:性能表现和未来趋势
引言 A. AI大模型在自然语言处理中的应用背景简介 近年来,随着深度学习和人工智能技术的快速发展,越来越多的研究人员和企业开始关注应用于自然语言处理的AI大模型。这些模型采用了深层的神经网络结构,具有强大的学习和处理能力,…...

三防平板定制服务:亿道信息与个性化生产的紧密结合
在当今数字化时代,个性化定制已经成为了市场的一大趋势,而三防平板定制服务作为其中的一部分,展现了数字化技术与个性化需求之间的紧密结合。这种服务是通过亿道信息所提供的技术支持,为用户提供了满足特定需求的定制化三防平板&a…...

【备战蓝桥杯】2024蓝桥杯赛前突击省一:基础数论篇
2024蓝桥杯赛前突击省一:基础算法模版篇 基础数论算法回顾 判断质数(试除法) 时间复杂度O(sqrt(n)) static int is_prime(int n){if(n<2) return 0;for (int i2;i<n/i;i){if(n%i0) return 0;}return 1; }质因…...