c++调python接口

1. 新建run.py文件,并定义相关接口:

import numpy as np
from scipy.fftpack import fftdef  str_add(str1,str2):return int(str1) + int(str2)def my_sort(data):data.sort()return datadef aw_fft(data, Fs):N = len(data)result = np.abs(fft(x=data, n=N) / N) * 2axisFreq = np.arange(int(N / 2)) * Fs / Nresult = result[range(int(N / 2))]idx = np.argmax(result)return axisFreq[idx]

2. 将run.py文件拷入c++工程目录下:

  • 项目->属性->VC++目录->包含目录->添加python头文件路径(C:\Python38\include);
  • 链接器->常规->附加库目录->添加python库路径(C:\Python38\libs);
  • 链接器->输入->输入python38.lib;

2.1 c++中直接运行python代码

#include <Python.h>
#include <iostream>
#include <math.h>
using namespace std;int main()
{// 初始化Python解释器Py_Initialize();// 检查初始化是否成功if (!Py_IsInitialized()) {return -1;}// 直接运行Python代码PyRun_SimpleString("import numpy as np\n");PyRun_SimpleString("print(np.sort(np.array([3,2,5,8,1])))");// 结束python运行环境Py_Finalize();
}

 2.2 c++中调run.py中的str_add接口

#include <Python.h>
#include <iostream>
#include <math.h>
using namespace std;int main()
{PyObject* pModule;PyObject* pFun;PyObject* pResult;PyObject* pArgs;// 初始化Python解释器Py_Initialize();// 检查初始化是否成功if (!Py_IsInitialized()) {return -1;}// 定位到python脚本所在目录PyRun_SimpleString("import sys\n");PyRun_SimpleString("sys.path.append('.')\n");// 导入py文件,文件名即可,不需要带后缀.pypModule = PyImport_ImportModule("run");if (!pModule) {printf("error1\n");exit(0);}// 获取模块中函数pFun = PyObject_GetAttrString(pModule, "str_add");if (!pFun) {printf("error2\n");exit(0);}// 创建参数string s1 = "33";string s2 = "66";pArgs = Py_BuildValue("(ss)", s1.c_str(), s2.c_str());// 调用函数pResult = PyObject_CallFunction(pFun, "O", pArgs);int res = PyLong_AsLong(pResult);printf("result=%d\n", res);// 使用结束后,释放掉这些Python对象Py_DECREF(pModule);Py_DECREF(pFun);Py_DECREF(pResult);Py_DECREF(pArgs);// 结束python运行环境Py_Finalize();return 0;
}

 2.3 c++中调run.py中的my_sort接口

#include <Python.h>
#include <iostream>
#include <math.h>
using namespace std;int main()
{PyObject* pModule;PyObject* pFun;PyObject* pResult;PyObject* pArgs;// 初始化Python解释器Py_Initialize();// 检查初始化是否成功if (!Py_IsInitialized()) {return -1;}// 定位到python脚本所在目录PyRun_SimpleString("import sys\n");PyRun_SimpleString("sys.path.append('.')\n");// 导入py文件,文件名即可,不需要带后缀.pypModule = PyImport_ImportModule("run");if (!pModule) {printf("error1\n");exit(0);}// 获取模块中函数pFun = PyObject_GetAttrString(pModule, "my_sort");// 创建参数pArgs = Py_BuildValue("[i,i,i,i,i]", 4,2,6,3,1);pResult = PyObject_CallFunction(pFun, "O", pArgs);printf("result=%d\n", PyList_Size(pResult));for (int i = 0; i < PyList_Size(pResult); i++) {PyObject* b = PyList_GetItem(pResult, i);int bi = _PyLong_AsInt(b);cout << bi << endl;}// 使用结束后,释放掉这些Python对象Py_DECREF(pModule);Py_DECREF(pFun);Py_DECREF(pResult);Py_DECREF(pArgs);// 结束python运行环境Py_Finalize();return 0;
}

2.4 c++中调run.py中的aw_fft接口 

#include <Python.h>
#include <iostream>
#include <math.h>
using namespace std;int main()
{PyObject* pModule;PyObject* pFun;PyObject* pResult;PyObject* pArgs;// 初始化Python解释器Py_Initialize();// 检查初始化是否成功if (!Py_IsInitialized()) {return -1;}// 定位到python脚本所在目录PyRun_SimpleString("import sys\n");PyRun_SimpleString("sys.path.append('.')\n");// 导入py文件,文件名即可,不需要带后缀.pypModule = PyImport_ImportModule("run");if (!pModule) {printf("error1\n");exit(0);}// 获取模块中函数pFun = PyObject_GetAttrString(pModule, "aw_fft");if (!pFun) {printf("error2\n");exit(0);}PyObject* list = PyList_New(1000);for (int i = 0; i < 1000; i++) {double temp = sin(2 * 3.14 * 235 * i / 6000);PyList_SetItem(list, i, PyFloat_FromDouble(temp)); }PyObject* Fs = Py_BuildValue("i", 6000);pArgs = PyTuple_Pack(2, list, Fs);pResult = PyObject_CallFunction(pFun, "O", pArgs);printf("%.2f\n", PyFloat_AsDouble(pResult));// 使用结束后,释放掉这些Python对象Py_DECREF(pModule);Py_DECREF(pFun);Py_DECREF(pResult);Py_DECREF(pArgs);// 结束python运行环境Py_Finalize();return 0;
}

 

 3. c++中将python接口编译dll文件

在dllmain.cpp中添加如下接口:

#include "utils.h"
#include <Python.h>
#include <iostream>float aw_fft(const char* py_name, const char* fun_name, double* data, int data_cnts, int Fs)
{PyObject* pModule;PyObject* pFun;PyObject* pArgs;PyObject* pResult;// 初始化Python解释器Py_Initialize();// 检查初始化是否成功if (!Py_IsInitialized()) {return -1;}// 定位到脚本所在目录PyRun_SimpleString("import sys\n");PyRun_SimpleString("sys.path.append('.')\n");// 导入py文件,写文件名即可,不需要带后缀.pypModule = PyImport_ImportModule("run");if (!pModule) {printf("error1\n");exit(0);}// 获取模块中函数pFun = PyObject_GetAttrString(pModule, "aw_fft");if (!pFun) {printf("error2\n");exit(0);}// 创建列表对象PyObject* list = PyList_New(data_cnts);for (int i = 0; i < data_cnts; i++) {PyList_SetItem(list, i, PyFloat_FromDouble(data[i]));}// 创建整形对象PyObject* sample = Py_BuildValue("i", Fs);// 创建参数pArgs = PyTuple_Pack(2, list, sample);// 调用函数pResult = PyObject_CallFunction(pFun, "O", pArgs);float result = PyFloat_AsDouble(pResult);// 释放对象Py_DECREF(pModule);Py_DECREF(pFun);Py_DECREF(pResult);Py_DECREF(pArgs);// 结束python运行环境Py_Finalize();return result;
}

新建utils.h文件:

#define CREATDLL_EXPORTS#ifdef CREATDLL_EXPORTS
#define DLL_API __declspec(dllexport)  
#else
#define DLL_API __declspec(dllimport)  
#endifextern "C" DLL_API void add_fun(int a, int b, int& c);
extern "C" DLL_API float aw_fft(const char* py_name, const char* fun_name, double* data, int data_cnts, int Fs);

生成解决方案,生成lib和dll文件,将util.h及Dll1.lib和Dll.dll文件拷入c++工程供调用:

#include <iostream>
#include"utils.h"using namespace std;#pragma comment	(lib, "Dll1.lib")
int main()
{double data[1000] = { 0 };for (int i = 0; i < 1000; i++) {data[i]= sin(2 * 3.14 * 235 * i / 6000);}const char* py_name = "run";const char* fun_name = "aw_fft";float res = aw_fft(py_name, fun_name, data, 1000, 6000);cout << res << endl;
}

c++能调用python的接口吗 c++调用python程序 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/307811.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 解决分支冲突

一、前言 一直习惯于 add commit push 的三步走&#xff0c;偶然间看到了一个评论说在 push 之前还有一个 pull&#xff0c;小小的疑问就埋在了我的心里。于是我就先了解了 pull 的工作原理&#xff0c;就是先拉取代码&#xff08;fetch&#xff09;再合并分支&#xff08;mer…

C语言-----结构体详解

前面已经向大家介绍过一点结构体的知识了&#xff0c;这次我们再来深度了解一下结构体。结构体是能够方便表示一个物体具有多种属性的一种结构。物体的属性可以转换为结构体中的变量。 1.结构体类型的声明 1.1 结构体的声明 struct tag {member-list;//结构体成员变量 }vari…

数字化时代:IT界的致富秘籍 —— 策略×态度×机遇

&#x1f31f; 数字化时代&#xff1a;IT界的致富秘籍&#x1f680; —— 策略态度机遇 在数字化浪潮中冲浪&#x1f3c4;‍♂️&#xff0c;IT行业犹如一片无限可能的蓝海。想要在这片汹涌的海洋中捕获财富&#xff0c;不是一件轻而易举的事。让我们一起深入探索&#xff0c;如…

(学习日记)2024.04.16:UCOSIII第四十四节:内存管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…

【电控笔记4】拉普拉斯-传递函数-pid

数据标幺化 拉普拉斯变换 欧拉公式 常见s变换 s变换性质

《QT实用小工具·二十一》鼠标十字线

1、概述 源码放在文章末尾 该项目实现了界面绘制十字线并跟随鼠标移动的过程&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidg…

PE文件的分析和构造超详细过程

本文详细讲述如何从0构造一个PE文件&#xff0c;运行该文件会弹出一个HelloPE的窗口 目录 预备知识 1. 构造DOS头IMAGE_DOS_HEADER 1.1 构造DOS_MZ头 1.2 构造DOS_STUB 2、构造PE头IMAGE_NT_HEADERS 248字节 2.1 signature 2.2 IMAGE_FILE_HEADER 2.3 IMAGE_OPTI…

Jenkins UI 自动化持续化集成测试

一&#xff1a;安装jenkins 环境 在官网下载msi 直接安装即可 二&#xff1a;设置全局变量 设置allure 路径 三&#xff1a;创建项目 1、创建自由风格项目 2、如果项目在本地&#xff0c;且本地服务器是windows &#xff0c;找到Jenkins安装根目录&#xff0c;寻找config…

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…

MQ:延迟队列

6.1场景&#xff1a; 1.定时发布文章 2.秒杀之后&#xff0c;给30分钟时间进行支付&#xff0c;如果30分钟后&#xff0c;没有支付&#xff0c;订单取消。 3.预约餐厅&#xff0c;提前半个小时发短信通知用户。 A -> 13:00 17:00 16:30 延迟时间&#xff1a; 7*30 * 60 *…

使用 Python 标记具有相同名称的条目

如果大家想在 Python 中标记具有相同名称的条目&#xff0c;可以使用字典&#xff08;Dictionary&#xff09;或集合&#xff08;Set&#xff09;来实现。这取决于你们希望如何存储和使用这些条目。下面我将提供两种常见的方法来实现这个目标。 1、问题背景 在处理数据时&…

Linux上的可执行文件在Windows上是不能运行的

一、概要 1、可执行文件的格式 Linux上的可执行文件是elf格式的 Windows上的可执行文件是exe格式的 Linux上的可执行文件在Windows上是不能运行的 2、程序的普通构建与静态构建 普通构建&#xff1a; 一个.c文件&#xff0c;用gcc命令编译成可执行文件(程序)&#xff0c…

登陆qq,经常收到qq游戏中心的推送信息,关闭推送信息

手动关闭推送信息的步骤&#xff1a; 1.点开左侧游戏中心 2、在打开界面&#xff0c;点击左下角自己的头像 3、打开设置中心&#xff0c;关闭所有的推送 4、完成关闭&#xff0c;不会推送了

Elasticsearch8.x 设置密码

文章目录 一、环境说明二、使用elasticsearch-reset-password工具修改1、elasticsearch-reset-password工具位置2、设置密码 一、环境说明 elasticsearch版本&#xff1a;8.13.0 系统版本&#xff1a;Ubuntu 18.04.6 二、使用elasticsearch-reset-password工具修改 1、elast…

通讯录实现

实现通讯录可以采用顺序表&#xff0c;单链表&#xff0c;双链表等数据结构实现&#xff0c;所以我们需要先写出顺序表&#xff0c;单链表&#xff0c;双链表的代码实现。 顺序表&#xff1a; 定义&#xff1a;顺序表&#xff08;Sequence List&#xff09;是一种线性表的存储…

anaconda创建了虚拟python环境,且安装了pytorch,但是pycharm中import torch运行时报错

报错如下&#xff1a; C:\Users\tashi\.conda\envs\test1\python.exe D:\project\python\transformer\main.py C:\Users\tashi\.conda\envs\test1\lib\site-packages\numpy\__init__.py:127: UserWarning: mkl-service package failed to import, therefore Intel(R) MKL init…

【计算机网络】ip子网划分--超详细例题解析

Hello!这一篇主要是计算机网络中的ip地址子网划分的例题&#xff0c;这里例举了四个题型。保证即便从0也可以掌握&#xff01;(前面是一些预备知识&#xff0c;不熟悉的小伙伴一定要看下学习下哦&#xff5e;) 这也是博主的学习过程&#xff0c;做题中仅仅我的理解哦。若文章中…

langchain 文本向量化存储,并检索相似 topK

目录 chroma 检索 faiss 检索 检索器 相似性 最大相关性mmr 相似数阈值 txt 有多行&#xff0c;我的这份数据有 67 行&#xff0c;样例如下&#xff1a; 字段1\t值1\n 字段2\t值2\n ... chroma 检索 pip install langchain-chroma 在本地下载了 embedding 模型&…

FastAPI - uvicorn设置 logger 日志格式

怎么将日志打印到文件 在main.py加入log_config“./uvicorn_config.json” import uvicornif __name__ "__main__":uvicorn.run("app:app", host"0.0.0.0", port8000, log_config"./uvicorn_config.json")uvicorn_config.json {&qu…