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