关于在C++里面调用Python(已成功解决)

        因为有在C++里面调用Python脚本的需要,所以对该问题进行学习,过程中遇到两个问题记录一下,方便大家有同样问题时能够及时解决,而不至于像我一样捣腾了一整天(哭)。

        进入正题:

        首先是按照一篇帖子里面的方法写了一个.cpp文件:

#include <Python.h> //C++调用Python需要引入该头文件


int main(int argc, char *argv[]) 
{

    // 初始化python解释器.C/C++中调用Python之前必须先初始化解释器
    Py_Initialize();
  
    // 执行一个简单的执行python脚本命令
    PyRun_SimpleString("print('hello world')\n");
    
    // 撤销Py_Initialize()和随后使用Python/C API函数进行的所有初始化——即清空Python资源
    Py_Finalize();

    return 0;
}

        代码中每一行的作用均有注释。

        然后开始cmake编译,出现以下两个报错:

        报错一:fatal error: Python.h: 没有那个文件或目录

        错误原因:没有找到Python.h头文件

        解决方法:在CMakeLists.txt文件中添加Python.h头文件所在目录

        具体为在CMakeLists.txt中添加如下行:

include_directories( /home/li/anaconda3/envs/yolov5/include/python3.8 )

        分析:我是用anaconda管理环境的所以我的Python.h头文件会在anaconda文件夹的路径下,大家可以根据自己Python.h文件实际所在路径进行修改。

        评价:添加后无报错fatal error: Python.h:没有那个文件或目录,报错解决。

        在解决上述问题后,编译时出现了新的报错:

        报错二:undefined reference to `Py_SetPythonHome'

        错误原因:没有链接到Python动态库,导致找不到对应库函数

        解决方法:在CMakeLists.txt文件中链接Python动态库

        具体为在CMakeLists.txt中添加如下行:

target_link_libraries( <工程名> 
                        /home/li/anaconda3/envs/yolov5/lib/libpython3.8.so )

        分析:libpython3.8.so中包含了这个Python项目的所有动态库,我们需要把它链接到我们的工程里面,Python脚本才可以正常运行。

        评价:添加后运行编译正常,生成可执行文件,运行得到正确结果。

        完整的CMakeLists.txt如下:

cmake_minimum_required( VERSION 2.8 )
project( expand )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

include_directories( /home/li/anaconda3/envs/yolov5/include/python3.8 )

add_executable( expand expand.cpp )
target_link_libraries( expand 
                        /home/li/anaconda3/envs/yolov5/lib/libpython3.8.so )


        

        Hope it helps !

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值