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

0. 工具介绍

用到的工具:

  • Microsoft Visual Studio Community 2022
  • Visual Studio Code

1. 配置环境

1.1 新建控制台应用程序

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

1.2 配置Python环境

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

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

1.3 执行Python脚本语句

#include <iostream>
#include <Python.h>

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.4 运行Python脚本

1.4.1 新建Python脚本文件

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

print("我来自Python脚本文件")

for i in range(10):
  print(i)

1.4.2 修改代码

#include <iostream>
#include <Python.h>

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.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 已跳过 ==========

原因分析:
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

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

#include <iostream>
#include <Python.h>

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();
}

在这里插入图片描述

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

#include <iostream>
#include <Python.h>

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();
}

在这里插入图片描述

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

#include <iostream>
#include <Python.h>

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();
}

在这里插入图片描述

  • 10
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值