c++调python接口

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程序 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 开发-自定义视图实现Tab效果

介绍 本示例介绍使用Text、List等组件&#xff0c;添加点击事件onclick,动画&#xff0c;animationTo实现自定义Tab效果。 效果预览图 使用说明 点击页签进行切换&#xff0c;选中态页签字体放大加粗&#xff0c;颜色由灰变黑&#xff0c;起到强调作用&#xff0c;同时&…

【C++入门】内联函数、auto与基于范围的for循环

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

非线性滤波相位解缠算法

相位解缠是InSAR数据处理流程中较为关键的步骤&#xff0c;同时也是地表高程模型重建 过程中的主要误差来源之一。迄今为止&#xff0c;针对干涉图的相位解缠问题&#xff0c;已经提出了各 种各样的相位解缠算法&#xff0c;这些算法大致可以分为以下几类&#xff1a;①路径跟踪…

nexus搭建maven与docker镜像的私有仓库

引言 通过nexus搭建maven与docker镜像的私有仓库,实现jar包与镜像动态更新、共享、存储。 一、nexus部署 通过docker-compose部署nexus name: java services:#############################环境#############################env-nexus:restart: always## 3.58.1image: so…

SpringBoot自动装配原理之@Import注解解析

文章目录 1. 概述2. 使用2.1 导入普通Bean2.2 导入配置类2.3 导入 ImportSelector 实现类2.4 导入 ImportBeanDefinitionRegistrar 实现类 3. 区别 1. 概述 当谈及现代Java开发领域中的框架选择时&#xff0c;SpringBoot无疑是无与伦比的热门之选。其简化了开发流程&#xff0…

即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv5-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

动态规划刷题(2)之杨辉三角(详细解释)

最近在自学动态规划,网上到处找资料学习: 在这里记录我的刷题历史: 题目都是在力扣里面刷的!! 这里,我放一个刷动态规划的链接在这里:动态规划知识点题库 - 力扣(LeetCode) 力扣 在这里附加动态规划相关知识点:动态规划(DP)-CSDN博客文章浏览阅读197次。动态规划…

简单的配置信息保存一例

上位机程序通常都会需要保存一些用户的配置信息。比如名称&#xff0c;年龄等 设置文件的使用非常方便&#xff0c;在项目名称上右击&#xff0c;选择“添加/新建项”。 如下图&#xff1a; 新建项目 新插入的设置文件Settings1会自动打开。添加对应项目 数据类型分别为str…

2024年第五届计算机视觉与信息技术国际会议(CVIT 2024)即将召开!

2024年第五届计算机视觉与信息技术国际会议&#xff08;CVIT 2024&#xff09;将于2024年8月16-18日在北京举行。CVIT 2024由北方工业大学主办&#xff0c;国内外的专家学者将齐聚一堂&#xff0c;共同分享最新的技术突破、研究方法和应用案例&#xff0c;共同推动计算机视觉与…

自动驾驶定位算法-递归贝叶斯滤波(Bayes Filter)

自动驾驶定位算法-递归贝叶斯滤波(Bayes Filter) 附赠自动驾驶学习资料和量产经验&#xff1a;链接 贝叶斯滤波器(Bayes Filter)是无人驾驶汽车中高精定位相关的基础技术&#xff0c;同时也是机器人技术中的基础算法。 如上图&#xff0c;开始机器人不知道自己在哪里&#xff…

gurobi不同版本切换

每年年底&#xff0c;gurobi都会推出新版本。新版本是大的迭代更新&#xff0c;求解问题的效率和精度都会提升。官方人员一般会建议我们安装最新的版本&#xff0c;此外&#xff0c;写论文审稿专家也会建议我们使用较新的版本。 从我们现装的版本切换到新版本。我以往的做法是…

微信朋友圈定时神器必须拥有!随时随地轻松发圈!

在微信朋友圈这个社交平台上&#xff0c;很多人都希望通过发布内容来进行个人推广或商业营销。但是&#xff0c;在忙碌或是节假日时&#xff0c;想要随意发布内容也会有些麻烦。 今天我要向大家分享的是一个微信朋友圈定时发布的神器&#xff0c;让您随时随地轻松发圈&#xf…

分享 GoLand 2024.1 激活的方案,支持JetBrains全家桶

大家好&#xff0c;欢迎来到金榜探云手&#xff01; GoLand 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 GoLand等。这些工具被广…

旧衣回收市场发展快速,线上小程序为商家提供新机遇

随着人们生活水平的提高&#xff0c;衣服淘汰的速度也在不断加快&#xff0c;每年垃圾站都会有非常多的废弃衣物。旧衣物的废弃不仅对环境有破坏&#xff0c;还造成了资源浪费。 因此&#xff0c;旧衣物回收行业受到了大众的关注&#xff0c;旧衣回收市场具有先天的优势&#…

十六进制前缀为Ox还是0x???

16进制的前缀是0x&#xff0c;数字零和英文字母X。 十六进制&#xff08;英文名称&#xff1a;Hexadecimal&#xff09;&#xff0c;是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9&#xff0c;A-F组成&#xff0c;字母不区分大小写。与10进制的对应…

基于 SSM 医院病历管理系统的设计与实现

摘 要 病历管理系统是医院管理系统的重要组成,在计算机技术快速发展之前&#xff0c;病人或者医生如果想记录并查看自己的健康信息是非常麻烦的&#xff0c;因为在以往病人的健康信息通常只保存在自己的病历卡或者就诊报告中&#xff0c;如果在就诊时想进行查看只能通过观看…

突如其来:OpenAI分家的Anthropic公司悄悄地释放出他们的秘密武器——Claude3

突如其来的消息&#xff0c;OpenAI分家的Anthropic公司悄悄地释放出他们的秘密武器——Claude3 这货居然在默默无闻中一举超越了GPT-4的地位。没发布会&#xff0c;没吹牛逼&#xff0c;就发了一帖子。 字少&#xff0c;事大。 Claude3独挡一面的推理能力 Anthropic推出了三款…

数学建模笔记(10)整数规划和0-1规划

前由 显然通关次数不能是小数&#xff0c;这就涉及到了整数问题。 定义 例题

骨传导耳机哪个牌子好?热销榜TOP5机型大揭秘!

市场上的骨传导耳机品质参差不齐&#xff0c;大家在挑选产品时一定要注意&#xff0c;避免入手到劣质产品&#xff0c;要知道&#xff0c;这些劣质产品不仅仅是使用体验差&#xff0c;并且长时间使用还容易损伤身体健康&#xff0c;那么面对市面上如此多的骨传导耳机品牌&#…

蓝桥杯嵌入式2023年第十四届省赛主观题解析

1 题目 2 代码 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "rtc.h" #include "tim.h" #include "gpio.h"/* Private includes --…