• C++调用Python(傻瓜式教学)


    0. 工具介绍

    用到的工具:

    • Microsoft Visual Studio Community 2022
    • Visual Studio Code

    1. 配置环境

    1.1 新建控制台应用程序

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    此处代码不太符合个人编码习惯,故稍加修改,修改后图如下:
    在这里插入图片描述
    检测代码是否能够运行:
    在这里插入图片描述

    1.2 配置Python环境

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    配置Python的lib库
    在这里插入图片描述

    1.3 执行Python脚本语句

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!\n";
    
        // 1. 设置Python的运行环境目录
        Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
    
        // 2. 初始化python解释器
        Py_Initialize();
        // 2.1 检查初始化是否成功
        if (!Py_IsInitialized()) {
            cout << "初始化失败" << endl;
            Py_Finalize();
        }
    
        // 2.2 执行Python脚本语句
        PyRun_SimpleString("print('I am Python!')");
    
        // 3. 清理Python解释器
        Py_Finalize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    1.4 运行Python脚本

    1.4.1 新建Python脚本文件

    在本项目文件夹下新建python脚本文件PyTest01.py,脚本内代码如下:
    在这里插入图片描述

    print("我来自Python脚本文件")
    
    for i in range(10):
      print(i)
    
    • 1
    • 2
    • 3
    • 4

    1.4.2 修改代码

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!\n";
    
        // 1. 设置Python的运行环境目录
        Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
    
        // 2. 初始化python解释器
        Py_Initialize();
        // 2.1 检查初始化是否成功
        if (!Py_IsInitialized()) {
            cout << "初始化失败" << endl;
            Py_Finalize();
        }
    
        // 2.2 执行Python脚本语句
        PyRun_SimpleString("print('I am Python!')");
    
        // 2.3 执行Python脚本文件
        const char* name = "PyTest01.py";
        FILE* fp = fopen(name, "r");
        PyRun_AnyFile(fp, name);
    
        // 3. 清理Python解释器
        Py_Finalize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    1.4.3 运行

    发生报错:
    在这里插入图片描述
    报错语句如下:

    1>Project01.cpp
    1>F:\VS_project\Project01\Project01\Project01.cpp(26,16): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>已完成生成项目“Project01.vcxproj”的操作 - 失败。
    ========== “生成”: 0 成功,1 失败,0 更新,0 已跳过 ==========
    
    • 1
    • 2
    • 3
    • 4

    原因分析:
    VS认为我们用fopen打开文件不安全,让我们采用fopen_s。我们可以在项目中属性页配置忽略这条报错即可。
    在这里插入图片描述

    在这里插入图片描述
    继续运行
    在这里插入图片描述

    2. 调用Python函数

    2.1 新建Python脚本

    • 新建PyFun.py
      在这里插入图片描述
    def pyfun():
      print("这是一个无参无返回值的函数")
    
    
    def pyfun_return_value():
      print("这是一个无参有返回值的函数")
      return 123
    
    def pyfun_return_value_with_parameter(arg1, arg2):
      print("这是一个有参有返回值的函数")
      print("arg1:", arg1)
      print("arg2:", arg2)
      return 456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.2 调用无参无返回值的函数

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!\n";
    
        // 1. 设置Python的运行环境目录
        Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
    
        // 2. 初始化python解释器
        Py_Initialize();
        // 2.1 检查初始化是否成功
        if (!Py_IsInitialized()) {
            cout << "初始化失败" << endl;
            Py_Finalize();
        }
    
         2.2 执行Python脚本语句
        //PyRun_SimpleString("print('I am Python!')");
    
         2.3 执行Python脚本文件
        //const char* name = "PyTest01.py";
        //FILE* fp = fopen(name, "r");
        //PyRun_AnyFile(fp, name);
    
        // 2.4 调用Python函数
        PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
        FILE* fp = fopen("PyFun.py", "r");
        PyRun_AnyFile(fp, "PyFun.py");
    
        PyObject* func = PyObject_GetAttrString(mod, "pyfun");
        PyObject_CallObject(func, 0);
    
        fclose(fp);
    
        Py_XDECREF(func);
        Py_XDECREF(mod);
    
        // 3. 清理Python解释器
        Py_Finalize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    2.3 调用无参有返回值的函数

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!\n";
    
        // 1. 设置Python的运行环境目录
        Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
    
        // 2. 初始化python解释器
        Py_Initialize();
        // 2.1 检查初始化是否成功
        if (!Py_IsInitialized()) {
            cout << "初始化失败" << endl;
            Py_Finalize();
        }
    
         2.2 执行Python脚本语句
        //PyRun_SimpleString("print('I am Python!')");
    
         2.3 执行Python脚本文件
        //const char* name = "PyTest01.py";
        //FILE* fp = fopen(name, "r");
        //PyRun_AnyFile(fp, name);
    
        // 2.4 调用Python函数
        PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
        FILE* fp = fopen("PyFun.py", "r");
        PyRun_AnyFile(fp, "PyFun.py");
    
        PyObject* func = PyObject_GetAttrString(mod, "pyfun_return_value");
        
        cout << PyLong_AsLong(PyObject_CallObject(func, 0)) << endl;
        fclose(fp);
    
        Py_XDECREF(func);
        Py_XDECREF(mod);
    
        // 3. 清理Python解释器
        Py_Finalize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    2.4 调用有参有返回值的函数

    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World!\n";
    
        // 1. 设置Python的运行环境目录
        Py_SetPythonHome(L"D:/Anaconda3/envs/python37");
    
        // 2. 初始化python解释器
        Py_Initialize();
        // 2.1 检查初始化是否成功
        if (!Py_IsInitialized()) {
            cout << "初始化失败" << endl;
            Py_Finalize();
        }
    
         2.2 执行Python脚本语句
        //PyRun_SimpleString("print('I am Python!')");
    
         2.3 执行Python脚本文件
        //const char* name = "PyTest01.py";
        //FILE* fp = fopen(name, "r");
        //PyRun_AnyFile(fp, name);
    
        // 2.4 调用Python函数
        PyObject* mod = PyImport_GetModule(PyUnicode_FromString("__main__"));
        FILE* fp = fopen("PyFun.py", "r");
        PyRun_AnyFile(fp, "PyFun.py");
    
        PyObject* func = PyObject_GetAttrString(mod, "pyfun_return_value_with_parameter");
        
        PyObject* tuple = PyTuple_New(2);
        PyTuple_SetItem(tuple, 0, PyLong_FromLong(555));
        PyTuple_SetItem(tuple, 1, PyUnicode_FromString("PyFunc with parameters!"));
    
        cout << PyLong_AsLong(PyObject_CallObject(func, tuple)) << endl;
    
        Py_XDECREF(tuple);
        Py_XDECREF(func);
        Py_XDECREF(mod);
    
        // 3. 清理Python解释器
        Py_Finalize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述

  • 相关阅读:
    C#设计模式详解(1)——Template Method(模板方法)
    MySQL主从复制(基于GTID--事务ID方式)
    实战项目:物流行业数据分析
    P3853 [TJOI2007]路标设置——二分答案
    算法学习笔记 - 哈希(Hash)
    攻防世界Reverse三星题 zorropub
    Excel管理Simulink SWC中的标定量与观测量之观测量
    (附源码)springboot学生宿舍管理系统 毕业设计 211955
    多数网工碌碌无为,都是败在这件事上
    mac git ssh
  • 原文地址:https://blog.csdn.net/qq_37955704/article/details/126577950