• C++调用python


    前言:我是在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成功。

  • 相关阅读:
    【WPF】操作RichTextBox(取值、赋值、清空、滚动条自动滚动实例、文本自动滚动实例)
    系统初始化 服务列表
    多个filter如何决定调用顺序
    IE浏览器 查看Form对象
    java try_catch 分析
    关于ClassLoader 和Class的俩个记录
    lis分析之一一批处理(任务)如何连接数据库的
    document.all("div).style.display = "none"与 等于""的区别
    Mybatis Util包
    Spring创建bean对象的三种方式
  • 原文地址:https://www.cnblogs.com/liweikuan/p/14803411.html
Copyright © 2020-2023  润新知