Visual Studio 2022+Python3.11实现C++调用python接口

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步。

查了一些资料,不是报这个错,就是报哪个错,没有找到和我安装的环境的一致的案例,于是将自己的摸索分享出来。

一、环境准备

1、Visual Studio 2022,下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/

图1

2、Python版本是3.11,下载地址:https://www.python.org/downloads/

图2

3、安装Visual Studio 2022和Python3.11

安装过程简单,此处不再赘述,我们的重点是看如何实现接口调用的。

二、配置Visual Studio 2022

安装好环境后,使用Visual Studio 2022创建一个新项目,我这里取名c++python。需要配置3个地方:

1、右击项目名称-->属性,选择VC++目录 ,根据python安装路径,配置包含目录 和库目录。python安装路径怎么查看?打开cmd,输入python回车,使用如下两个命令即可看到python路径。

>>> import sys

>>> sys.path

将python安装路径下的include文件夹和libs文件夹复制到刚才新建的项目c++python目录下,配置如图所示:

图3

2、右击项目名称-->属性,选择C/C++下的常规,配置附加包含目录, 加上项目中include的路径,如图所示:

图4

3、右击项目名称-->属性,选择链接器下的输入,配置附加依赖项,将项目中的libs目录中python311.lib复制一份,改名为python311_d.lib,附加依赖项的内容填写C:\Users\source\repos\c++python\libs\python311_d.lib;如图所示:

图5

三、编写python代码和C++代码

  1. 首先,创建一个名为test_python.py的Python文件,内容如下:

    def add(a, b):
    return a + b

  2. 然后,创建一个名为main.cpp的C++文件,内容如下:

    #include
    #include <Python.h>

    int main()
    {
    /初始化python/
    Py_Initialize();

    复制代码
     /*初始化python系统文件路径,否则加载不到要调用的test_python.py文件*/
     PyRun_SimpleString("import sys");
     PyRun_SimpleString("sys.path.append('./')");
    
     /*加载要调用的python文件名称,当前测试文件名称:test_python.py*/
     PyObject* pName = PyUnicode_DecodeFSDefault("test_python");
    
     PyObject* pModule = PyImport_Import(pName);
    
     Py_XDECREF(pName);
    
     if (pModule != NULL) 
     {
         /*加载python模块中的函数*/
         PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
    
         if (PyCallable_Check(pFunc)) 
         {
             /*给pythonm模块中的函数add传递2个参数,以元组的形式传递*/
             PyObject* pArgs = PyTuple_New(2);
    
             /*给add函数传递第一个参数6*/
             PyTuple_SetItem(pArgs, 0, PyLong_FromLong(6));
             /*给add函数传递第二个参数10*/
             PyTuple_SetItem(pArgs, 1, PyLong_FromLong(10));
             /*C++的python接口调用add函数,返回计算结果*/
             PyObject* pValue = PyObject_CallObject(pFunc, pArgs);
    
             Py_XDECREF(pArgs);
    
             if (pValue != NULL) 
             {
                 /*打印计算结果*/
                 std::cout << "\n " << std::endl;
                 std::cout << "Result of call: " << PyLong_AsLong(pValue) << std::endl;
                 std::cout << "\n " << std::endl;
    
                 Py_XDECREF(pValue);
    
             }
             else 
             {
                 PyErr_Print();
             }
         }
         else 
         {
             if (PyErr_Occurred()) 
             {
                 PyErr_Print();
             }
    
             fprintf(stderr, "Cannot find function \"add\"");
         }
    
         Py_XDECREF(pFunc);
    
         Py_XDECREF(pModule);
     }
     else 
     {
         PyErr_Print();
    
         fprintf(stderr, "Failed to load \"%s\"", "test");
    
         return 1;
     }
    
     /*结束python初始化*/
     Py_Finalize();
    
     return 0;

    }

test_python.py和main.cpp在同一目录,如图所示:

图6

  1. 编译

1>正在生成代码

1>Previous IPDB not found, fall back to full compilation.

1>All 16 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.

1>已完成代码的生成

1>c++python.vcxproj -> C:\Users\source\repos\c++python\x64\Release\c++python.exe

========== "全部重新生成": 1 成功,0 失败,0已跳过 ==========

========== 占用时间 00:02.052 ==========

  1. 点击菜单"调试-->开始执行(不调试)运行,可以看到输出结果:

图7

相关推荐
计算机毕业编程指导师11 分钟前
Python大数据毕设:基于Hadoop的病毒式社交媒体趋势和参与度分析系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·毕业设计·课程设计·社交媒体
计算机毕业编程指导师13 分钟前
【计算机毕设选题推荐】基于Spark与Hadoop的AI就业收入区域差异分析系统 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·数据分析·spark·毕业设计·课程设计·ai就业收入
小猴子爱上树17 分钟前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
lzqrzpt38 分钟前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网
专业程序开发源40 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
jimy141 分钟前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
蒲公英eric1 小时前
人口增长问题:从 Malthus 到 Logistic 的建模之旅
人工智能·python·数学建模·人口增长问题
全栈练习生1 小时前
大模型原理之 Softmax
python·ai
迅猛龙办公室1 小时前
python获取星期字符串
开发语言·python
打工仔折腾 AI1 小时前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战