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

        首先直接上干货,我是借鉴了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文件!!!

猜你喜欢

转载自blog.csdn.net/kuwola/article/details/129917041
今日推荐