• 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文件,内容如下:

    1. def add(a, b):
    2. return a + b

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

    1. #include <iostream>
    2. #include <Python.h>
    3. int main()
    4. {
    5. /*初始化python*/
    6. Py_Initialize();
    7. /*初始化python系统文件路径,否则加载不到要调用的test_python.py文件*/
    8. PyRun_SimpleString("import sys");
    9. PyRun_SimpleString("sys.path.append('./')");
    10. /*加载要调用的python文件名称,当前测试文件名称:test_python.py*/
    11. PyObject* pName = PyUnicode_DecodeFSDefault("test_python");
    12. PyObject* pModule = PyImport_Import(pName);
    13. Py_XDECREF(pName);
    14. if (pModule != NULL)
    15. {
    16. /*加载python模块中的函数*/
    17. PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
    18. if (PyCallable_Check(pFunc))
    19. {
    20. /*给pythonm模块中的函数add传递2个参数,以元组的形式传递*/
    21. PyObject* pArgs = PyTuple_New(2);
    22. /*add函数传递第一个参数6*/
    23. PyTuple_SetItem(pArgs, 0, PyLong_FromLong(6));
    24. /*add函数传递第二个参数10*/
    25. PyTuple_SetItem(pArgs, 1, PyLong_FromLong(10));
    26. /*C++的python接口调用add函数,返回计算结果*/
    27. PyObject* pValue = PyObject_CallObject(pFunc, pArgs);
    28. Py_XDECREF(pArgs);
    29. if (pValue != NULL)
    30. {
    31. /*打印计算结果*/
    32. std::cout << "\n " << std::endl;
    33. std::cout << "Result of call: " << PyLong_AsLong(pValue) << std::endl;
    34. std::cout << "\n " << std::endl;
    35. Py_XDECREF(pValue);
    36. }
    37. else
    38. {
    39. PyErr_Print();
    40. }
    41. }
    42. else
    43. {
    44. if (PyErr_Occurred())
    45. {
    46. PyErr_Print();
    47. }
    48. fprintf(stderr, "Cannot find function \"add\"");
    49. }
    50. Py_XDECREF(pFunc);
    51. Py_XDECREF(pModule);
    52. }
    53. else
    54. {
    55. PyErr_Print();
    56. fprintf(stderr, "Failed to load \"%s\"", "test");
    57. return 1;
    58. }
    59. /*结束python初始化*/
    60. Py_Finalize();
    61. return 0;
    62. }

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

    图6

    3. 编译

    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 ==========

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

    图7

  • 相关阅读:
    为什么Excel插入图片不显示,点击能够显示
    关于实例变量、对象和引用
    9.19号作业
    微服务学习第四十四节 Sentinel整合GateWay
    【解包裹】基于Matlab实现多聚类相位展开算法
    前端教程-rollup
    Qt QSS 属性 vs QObject属性
    JVM的垃圾回收机制(GC)
    Ajax学习笔记第二天
    深度学习区分不同种类的图片
  • 原文地址:https://blog.csdn.net/qq_20490175/article/details/134771732