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

python-C接口-C语言调用python函数-简单范例

文章目录

  • 1.void Py_Initialize()
  • 2.int Py_IsInitialized()
  • 3.PyImport_ImportModule("ScriptModule")
  • 4.PyObject_GetAttrString(sm, "GetKeyShotVersion");
  • 5.PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)
  • 6.范例

1.void Py_Initialize()

初始化 Python 解释器。 在嵌入 Python 的应用程序中,应该在使用任何其他 Python/C API 函数之前调用它; 有关少数例外情况,请参见 Before Python Initialization。

这将初始化加载模块表 (sys.modules),并创建基本模块 builtins、__main__ 和 sys。 它还初始化模块搜索路径 (sys.path)。 不设置sys.argv; 为此使用 PySys_SetArgvEx()。 这是第二次调用时的空操作(不首先调用 Py_FinalizeEx())。 没有返回值; 如果初始化失败,这是一个致命错误。

2.int Py_IsInitialized()

当 Python 解释器已初始化时返回真(非零),否则返回假(零)。 在调用 Py_FinalizeEx() 之后,这将返回 false,直到再次调用 Py_Initialize()。

3.PyImport_ImportModule(“ScriptModule”)

导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。

4.PyObject_GetAttrString(sm, “GetKeyShotVersion”);

返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句,o.attr_name。

5.PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)

此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。

6.范例

//获取版本号
std::string APythonCall::GetKeyShotVersion() {/*Py_InitializeEx(0);PyEval_InitThreads();*/Py_Initialize();//检查初始化是否成功  if (!Py_IsInitialized()) {return false;}//添加脚本所在当前路径  //PyRun_SimpleString("import sys");//PyRun_SimpleString("sys.path.append('.\')");//执行模块并调用函数PyObject* sm = PyImport_ImportModule("ScriptModule");PyObject* pFunc = PyObject_GetAttrString(sm, "GetKeyShotVersion");PyObject *pReturn = PyEval_CallObject(pFunc, NULL);char* rlt=0;PyArg_Parse(pReturn, "s", &rlt);//读取数据std::string rltStrStd;if (rlt){rltStrStd = rlt;}//utf8转gbkrltStrStd = UTF8toGBK(rltStrStd);//结束调用if (sm){Py_DECREF(sm);}if (pFunc){Py_DECREF(pFunc);}if (pReturn){Py_DECREF(pReturn);}Py_Finalize();return rltStrStd;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用 Nuxt 的 showError 显示全屏错误页面
  • 上传文件到github仓库
  • Flask restful 前后端分离和 restful 定义
  • 【深度学习】openai gpt调用的格式,参数讲解,tools是什么
  • Python 3 命名空间和作用域
  • 数据库系统 第25节 数据库集群 案例分析
  • 【Remi Pi使用HDMI屏幕显示QT界面】将QT工程在Ubuntu虚拟机交叉编译好拷贝到开发板并运行
  • 42-java 为什么不推荐使用外键
  • 美团一面部分问题
  • [指南]微软发布Windows-Linux双系统无法启动的完整修复方案
  • Java基础——正则表达式
  • AI可预测地震,科技的“预知未来”?
  • Leetcode每日刷题之面试题01.06字符串压缩(C++)
  • 第一次运行Neo4J
  • CANoe.DiVa的应用——生成TP层测试用例过程流程详解(二)
  • SegmentFault for Android 3.0 发布
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • C++类的相互关联
  • fetch 从初识到应用
  • React-生命周期杂记
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue-loader 源码解析系列之 selector
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从零开始的无人驾驶 1
  • 基于webpack 的 vue 多页架构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 面试遇到的一些题
  • 前端工程化(Gulp、Webpack)-webpack
  • 浅谈web中前端模板引擎的使用
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 思否第一天
  • 追踪解析 FutureTask 源码
  • ​补​充​经​纬​恒​润​一​面​
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • $jQuery 重写Alert样式方法
  • (day6) 319. 灯泡开关
  • (LLM) 很笨
  • (八)Flask之app.route装饰器函数的参数
  • (二)linux使用docker容器运行mysql
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)scrum常见工具列表
  • .net core 管理用户机密
  • .Net Winform开发笔记(一)
  • .NET面试题(二)
  • .NET上SQLite的连接
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序