本文介绍: 大家好!我是,欢迎关注持续分享更多实用的编程经验和开发技巧共同进步。查了一些资料,不是报这个错,就是报哪个错,没有找到和我安装环境的一致的案例,于是将自己的摸索分享出来。

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

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

一、环境准备

1、Visual Studio 2022,下载地址:https://visualstudio.microsoft.com/zhhans/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:Userssourcereposc++pythonlibspython311_d.lib;如图所示:

图5

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

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

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

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

#include <iostream>
#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

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:Userssourcereposc++pythonx64Releasec++python.exe

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

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

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

图7

原文地址:https://blog.csdn.net/qq_20490175/article/details/134771732

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_37104.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注