c++调python接口

news2024/11/19 14:52:33

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

import numpy as np
from scipy.fftpack import fft

def  str_add(str1,str2):
	return int(str1) + int(str2)

def my_sort(data):
	data.sort()
	return data

def aw_fft(data, Fs):
	N = len(data)
	result = np.abs(fft(x=data, n=N) / N) * 2
	axisFreq = np.arange(int(N / 2)) * Fs / N
	result = 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文件,文件名即可,不需要带后缀.py
    pModule = 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文件,文件名即可,不需要带后缀.py
    pModule = 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文件,文件名即可,不需要带后缀.py
    pModule = 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文件,写文件名即可,不需要带后缀.py
    pModule = 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)  
#endif

extern "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.coloradmin.cn/o/1594182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在开发过程中使用 git rebase 还是 git merge

在开发过程中使用 git rebase 还是 git merge Merge(合并)的优点和缺点Rebase(变基)的优点和缺点总结&#xff1a; Git merge 和rebase的目的是一样的&#xff0c;它们都是将多个分支合并成一个。 虽然他们最终的目标是一样的&#xff0c;但这两种方法实现的方式是不同的。那么…

本地化部署离线开源免费语音识别API,支持多模态AI能力引擎

思通数科作为一家专注于多模态AI能力开源引擎平台&#xff0c;其技术产品涵盖了自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别以及语音识别等多个领域。在语音识别这一细分市场&#xff0c;思通数科的技术产品中的音频文件转写服务有着相似的应用场景和功能特点。…

开源!工厂数字化项目会用到的地理信息系统

软件介绍 QGIS&#xff08;Quantum GIS&#xff09;是一款免费、开源、跨平台的地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;适用于Unix平台、Windows和MacOS。提供了强大且用户友好的功能&#xff0c;使其成为地理信息处理领域的热门选择。 功能特点 1.空间数据管…

【Linux】vim指令大全,收藏这篇就够了

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Pygame经典游戏:贪吃蛇

------------★Pygame系列教程★------------ Pygame经典游戏&#xff1a;贪吃蛇 Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;dra…

Swagger转换成Excel文件

1、添加swagger解析依赖包&#xff1a; <dependency><groupId>io.swagger.parser.v3</groupId><artifactId>swagger-parser</artifactId><version>2.1.12</version></dependency>2、示例代码&#xff1a; package com.rlclou…

常见漏洞原理简介

今天复习上个月学的漏洞的知识点。 一、SQL注入漏洞 sql注入是就是通过把SQL语句插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。 理解这张图就可以理解sql注入的原理&#xff0c;因为在mysql数据库中存在一个Informat…

vim中如何进行批量注释?取消批量注释?

1.首先进入vim的命令模式。然后按【ctrlV】 2.按下【J】,可以向下继续选中。 3.选择完成后&#xff0c;直接按下【shifti】进入插入模式。输入【//】&#xff0c; 4.最后按【ESC】即可进行批量注释。 取消注释又是如何操作的呢&#xff1f; 前面的步骤都一样&#xff0c;首先…

算法100例(持续更新)

算法100道经典例子&#xff0c;按算法与数据结构分类 1、祖玛游戏2、找下一个更大的值3、换根树状dp4、一笔画完所有边5、树状数组&#xff0c;数字1e9映射到下标1e56、最长回文子序列7、超级洗衣机&#xff0c;正负值传递次数8、Dijkstra9、背包问题&#xff0c;01背包和完全背…

1.9 数据结构之 并查集

编程总结 在刷题之前需要反复练习的编程技巧&#xff0c;尤其是手写各类数据结构实现&#xff0c;它们好比就是全真教的上乘武功 本栏目为学习笔记参考&#xff1a;https://leetcode.cn/leetbook/read/disjoint-set/oviefi/ 1.0 概述 并查集&#xff08;Union Find&#xff09…

5、LMDeploy 量化部署 LLMVLM实战(homework)

基础作业&#xff08;结营必做&#xff09; 完成以下任务&#xff0c;并将实现过程记录截图&#xff1a; 配置lmdeploy运行环境 由于环境依赖项存在torch&#xff0c;下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端&#xff0c;创建一…

SENet模型原理及代码介绍

一.模型简介&#xff1a; SENet的全称叫Squeeze-and-Excitation Networks&#xff08;挤压-激励网络&#xff0c;简称SENet&#xff09;&#xff0c;于2017年提出&#xff0c;并拿下了当年的ImageNet分类比赛的冠军。ResNet是2015年ImageNet的冠军&#xff0c;2016年ResNeXt&am…

字节码文件的组成

字节码文件的组成 字节码文件的组成1 以正确的姿势打开文件2 字节码文件的组成2.1 基本信息2.2 常量池2.3 字段2.4 方法2.5 属性 3 字节码常用工具3.1 javap3.2 jclasslib插件3.3 Arthas 4 字节码常见指令 字节码文件的组成 1 以正确的姿势打开文件 字节码文件中保存了源代码…

构建BTI的编译工具支持

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路&#xff0c;这个电路里面必须要的东西&#xff08;如人需要喝水吃饭温度等情况&#xff0c;才能或者&#xff09; 现在我们要解决这三个问题 这里V开头的&#xff0c;都是电源管脚 这里解释一下&#xff1a; 这里要注意哪些是电路电压&#xff0c;哪…

【300套】基于Springboot+Vue的Java毕业设计项目(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享300的Java毕业设计&#xff0c;基于Springbootvue框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业…

考研高数(对比一元微分学和一元积分学概念)

1.一元微分学的概念和一元积分学的概念 一元微分 1.导数 函数一点可导的充要条件&#xff1a;左右导数均存在且相等&#xff08;也可说左右极限存在且相等&#xff09; 函数一点可导的必要条件&#xff1a;若f(x)在一点可导&#xff0c;则f(x)在该点连续。反之未必。 2.导数…

如何进行计量经济分析

计量经济分析是定量分析的常用方法&#xff0c;在经济分析领域有着广泛且重要的应用。计量经济分析以一定的经济理论和统计数据为基础&#xff0c;运用数学、统计学相关方法&#xff0c;通过建立计量模型&#xff0c;并运用软件进行操作&#xff0c;从而实现对经济问题的定量分…

day57 判断子序列 不同的子序列 两个字符串的删除操作 编辑距离

题目1 392 判读子序列 题目链接 392 判断子序列 题意 判断字符串s是否为字符串t的子序列 &#xff08;子序列的相对位置在原字符串中不改变&#xff09; 就是求最长公共子序列的长度与字符串s的长度是否相等 动态规划 1&#xff09;确定dp数组及下标i的含义 dp[i][j]…

视频知识整理

1 视频播放器原理 视频播放器播放一个互联网上的视频文件&#xff0c;需要经过以下几个步骤&#xff1a; 解协议&#xff1a;将流媒体协议的数据&#xff0c;解析为标准的相应的封装格式数据 解封装&#xff1a;将封装格式的数据&#xff0c;分离成为音频流压缩编码数据和视…