VS2022中一步实现C++调用python程序文件

2023-05-16

        首先直接上干货,我是借鉴了C++调用python文件(包含第三方库) - 知乎 (zhihu.com)

与(13条消息) 2.VS2017调用Python函数_vs2017 python3.11_糊面包包专属的博客-CSDN博客​​​​​

这两篇博客。

        针对网上提出的大量的关于C++调用python的教程,实际上教的只能说是残缺品,我所看的这两篇介绍的十分详细,根据这两篇文章,总结调用过程如下:

        首先就是配置相关的环境,配置环境这一块如果没配置好的话,后面会出现很多的bug,我当时没有配置好环境,就一直报错没有找到python38_d.lib文件。鉴于此,希望看过我这篇文章的友友们都能发现问题之所在。

        一、给项目属性中配置属性的VC++目录中的包含目录和库目录,加入我们电脑中的python所在的路径。由于我用的是anaconda创建的虚拟环境,所以就以这个例子来讲了,不是虚拟环境的同样可以借鉴

1.1 包含目录

在包含目录中加入虚拟环境中的include文件夹路径

1.2 库目录

在库目录中加入虚拟环境中的libs所在路径

二、在链接器中的输入中的附加依赖项中,加入虚拟环境中的libs中的python38.lib,将其重命名成python38_d.lib文件当然,如果你是python3.9或者其他版本,相应地改一下就行。这个文件的加入,真的很重要!!!!!!我就不说三遍了,不加这个文件名字的后果就是,运行的时候会报找不到或者没有python38_d.lib文件,然后又开始不断尝试修改这个bug的网上教程,真的是费力不讨好的方法捏,不如事先就改好。

三、然后将两个重要文件夹复制到C++编译exe同目录下,该路径如下(感觉其实加不加都行)保险起见还是加一下吧

虚拟环境中的两个重要的文件夹路径分别是:

D:\python3\DLLs
D:\python3\Lib

这个也是根据读者当初安装python的路径要做出相应的调整。不进行这一步,引入第三方库的时候会出错。如下所示

四:加入一些不容易注意的文件,以免小bug,比如我用的是虚拟环境中的python版本是3.8,要将python38.dll加入exe所在文件夹中,如下方第一张图所示,以及将libs文件夹中的python38.lib文件改成python38_d.lib放入下方第二张图所在路径:

配置好了这些环境就可以开始调用python程序了:那我跑的这个例子提供给你们吧,也是借鉴的两篇文章中的一个。

这个是C++调用的python程序的例子:

#include <iostream>
#include <Python.h>
#include<string>
using namespace std;
int main()
{
	Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化

	if (!Py_IsInitialized())
	{
		printf("初始化失败!");
		return 0;
	}

	PyObject* pModule = NULL;//声明变量
	PyObject* pFunc1 = NULL;// 声明变量
	PyObject* pFunc2 = NULL;// 声明变量
	PyObject* pFunc3 = NULL;// 声明变量
	pModule = PyImport_ImportModule("hello");//这里是要调用的文件名
	if (pModule == NULL)
	{
		cout << "没找到" << endl;
	}

	pFunc3 = PyObject_GetAttrString(pModule, "func1");//这里是要调用的函数名
	PyObject* args2 = Py_BuildValue("ii", 25, 6);//给python函数参数赋值

	PyObject* pRet = PyObject_CallObject(pFunc3, args2);//调用函数
	int res = 0;
	PyArg_Parse(pRet, "i", &res);//转换返回类型

	cout << "res:" << res << endl;//输出结果

	Py_Finalize(); // 与初始化对应
	system("pause");
	return 0;

}

调用的python文件也要放到C++编译exe同目录下。如果用的是debug就放到那个编译exe目录下,如果是release,同理也放到那个目录下就行。如下图所示:

这里需要有两个python文件,一个没有第三方库的引入,一个有第三方库的引入。前者负责引入后者的函数。

第一个文件,是c++代码里调用的文件。

hello.py

import demo as d
import other as oth

def func1(a,b):
    return d.formula1(a,b)

第二个文件,是真正想执行的程序

demo.py

import numpy as np

def formula1(A, F):
    print(A,F)
    return np.array(A*F)

 成功运行,运行得到如下结果:

希望看到这篇文章的各位朋友们都能成功调用python文件!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2022中一步实现C++调用python程序文件 的相关文章

  • 【SSH】解决 WIN10 通过 ssh 连接 Mac 中文乱码

    问题 xff1a MacOSX 下默认的是 utf 8 字符集 xff0c WIN10 通过 ssh 连接后显示是 utf 8 xff0c 但是中文乱码 原因 xff1a 这种情况一般是终端和服务器的字符集不匹配 在 Mac 终端中输入 l
  • 【python】Notebook

    CONTENT 1 小Tips三元运算符平均数 np mean range 与 np arange 求最大 小值及索引值合并 list 为字符串剪切板模块 pyperclip将秒数转化为小时分钟秒 2 数学随机数 3 文件相关按分隔文件路径
  • 【Mac】Mac 系统读写 NTFS 格式硬盘

    查看磁盘 typename diskutil list 更新 etc fstab文件 sudo vim etc fstab 写入如下内容 xff1a LABEL 61 GRMCULXFRER none ntfs rw auto nobrow
  • 小米路由器青春版刷入其他固件

    小米路由器青春版搭载的是基于OpenWRT深度定制的智能路由器操作系统MiWiFi ROM xff0c 实质即嵌入式linux系统 小米路由器青春版自带的miwifi r1cl all 59371 2 1 26 bin及其以下版本中存在通过
  • 【数据结构】排序算法

    不稳定的排序算法 xff1a 快排 堆排 选择 希尔 排序算法时间复杂度空间复杂度稳定性冒泡 xff08 Bubble Sort xff09 O n 2 O 1 稳定快排 xff08 Quick Sort xff09 O n logn O
  • 【数据结构】POJ 1985 Cow Marathon(树的直径)

    链接 xff1a http poj org problem id 61 1985 题意 xff1a 有 n n n 个农场和 m m m 条路 xff0c 以及每条
  • 【C#】接口的基本概念

    目录 基本 什么是接口接口与抽象类的区别 抽象类接口实例 设计接口 基本 什么是接口 C 接口 interface 是 xff1a 用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致 有了这个协定 xff0c 就可以抛开编程
  • 部署Sonic编译服务器

    编译Sonic环境 部署Sonic编译环境编译准备开机自动挂载硬盘创建用户安装 Docker开始编译 部署Sonic编译环境 先给服务器安装 Ubuntu20 04 02 系统 xff0c Sonic编译 Github 链接 sonic b
  • 【闲聊STP/RSTP】

    闲聊STP RSTP xff08 Spanning Tree Protocol xff09 STP xff08 Spanning Tree Protocol xff09 xff0c 1998年IEEE提出的802 1D协议 xff0c 它是
  • 实现云弹性的一种方法—系统和混沌测试

    在当今数字技术时代 xff0c 停工就意味着停机 xff0c 构建弹性云结构势在必行 例如 xff0c 在新冠疫情期间 xff0c IT 维护团队不能再在本地重新启动数据中心的任何服务器 如果本地硬件出现故障 xff0c 这可能会导致访问所
  • 如何选择云数据库?

    无论你是在建立你的第一个还是第五十个应用程序 xff0c 选择一个数据库是最困难的选择之一 这将是你做出的第一个决定之一 xff0c 也可能是在你的应用程序中根深蒂固的一个决定 由于有大量优秀的数据库可用 xff0c 而且有大量现成的信息可
  • Hbase(一)入门

    Hbase xff08 一 xff09 一 Hbase概述1 简介2 Hbase数据模型3 Hbase简化架构4 写数据5 MemStore Flush6 读数据7 StoreFile Compaction 二 Hbase安装1 Hbase
  • 解决properties文件读取中文乱码

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net qq 39237513 article
  • gcc下载地址(Linux/windows安装)

    gcc官网 xff1a http gcc gnu org gcc镜像站点 xff1a https gcc gnu org mirrors html 各版本下载地址 ftp ftp mirrorservice org sites source
  • 树莓派系统镜像备份

    SD卡系统镜像备份 引言1 下载镜像备份脚本2 查看sd卡设备名称3 复制镜像4 压缩镜像 引言 SD卡系统镜像备份有多种方式 xff0c 最简单粗暴的是使用Win32diskImager工具 xff0c 将SD卡的镜像直接读取 xff0c
  • 不同版本mysql-connector-java的jar包下载地址

    jar包下载方式 官网地址 xff1a MySQL Download Connector J xff0c 如果你打不开官网 xff0c 在下面我为你准备了直接下载jar包的链接地址 在选择操作系统时 xff0c 此处选择platform i
  • 需要来自administrators的权限才能对此文件夹进行更改

    1 右键文件夹 xff0c 选择 属性 2 选择 安全 3 选择 高级 4 选择 更改 5 选择 高级 6 选择 立即查找 7 选择 Administrators xff0c 然后点击确定 8 再次点击 确定 9 选择 替换子容器和对象的所
  • 远程计算机或设备不接受连接解决方法

    当你的电脑浏览器不能正常上网时 xff0c 显示 点击网络诊断 xff0c 显示远程计算机或设备将不接受连接 解决办法 xff1a 1 点击左下角开始 xff0c 点击运行 xff0c 输入inetcpl cpl xff0c 点击确定 xf
  • Navicat 右键刷新没用

    Navicat 右键刷新没用 xff0c 点下方刷新图标才有用 右键刷新应该是刷新表结构 xff0c 下方刷新图标是刷新这张表的数据
  • leetcode 150. 逆波兰表达式求值

    题目描述 xff1a 给你一个字符串数组 tokens xff0c 表示一个根据 逆波兰表示法 表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 注意 xff1a 有效的算符为 39 43 39 39 39 39 39 和 3

随机推荐