前言:我是在Visual studio中使用C++调用python的。如果需要使用QT编译器,QT中的环境配置自行查找。
C++调用python步骤:
第一步:在VS中进行环境配置,使得可以调用python.h库。
找到包含.h文件的Include文件夹,将其绝对路径添加到包含目录中;找到包含.lib文件的libs文件夹,并将其绝对路径添加到库目录中。
此处的注意事项:原本在libs文件中是没有python39_d.lib文件的,此时需要手动的对python39.lib文件进行复制并重命名为python39_d.lib,以免发生错误,如下图所示:
此时使用#include”Python.h”库函数可能会出现找不到.dll文件的问题,此时的解决办法有两个:一:将python39.dll文件拷贝到system32文件夹下。二:将python39.dll文件拷贝到此C++工程目录下。两种方法都可解决此问题。
第二步:在VS编译器中调用python程序。程序如下图所示:
首先需要设置python解释器的位置,如我是用的是miniconda中虚拟环境pytorch中的python解释器,则使用main主函数中的第一句,大写L不要落下。在使用python解释器前需要对其进行初始化的操作。
随后的PyRun_SimpleString()函数是在C++中使用python中的语句,例如Import torch,则是测试调用torch包是否成功。注:我在调用Numpy这个包的时候,出现未找到的问题,但是在下载pytorch时确实是有这个包的,删除原numpy包,重新安装即可成功引用。
为了能够方便的执行python程序,我直接将python程序拷贝到C++项目目录下,如图:
此时通过设置相对路径则可查找到目标文件。
下面的PyImport_ImportModule函数是找到需要执行的文件,PyObject_GetAttrString函数是找到文件中需要执行的函数(一般的情况下,我们在python中都是执行一个主函数,但是在C++中是无法直接调用主函数的,此时可以将主函数中的所有语句调出,拷贝到一个新的函数中,在C++中调用这个新的函数即可)。Py_BuildValue函数是设置调用的python函数的形参。PyObject_CallObject函数是接受python执行程序的返回值。我的python程序新建函数如下:
注明:如果不需要传递参数的话或者无返回值的话也无所谓,这个就是一个语法,简单设置一下即可。
最后,最难调的一个bug:
所有网上的教程都是调用一个python文件中一个函数,没有关联关系,但是在实际的项目中,我们的一个python文件关联了其他python文件和不同各种各样的包,我们需要通过一个函数将所有的这些运行起来,解决办法如下:
在C++文件中,对你引用的函数,包进行一一测试,直到所有的包,函数都测试通过,此时整个程序即可正确运行。
我的程序正确运行展示:
C++运行如下
Python程序运行如下
运行结果相同,C++调用python成功。