使用C/C++调用python脚本

  • Post author:
  • Post category:python




版本

VS2022,Python3.10.3



Python安装

一定记得勾选 “

Download debug binaries

” ,表示是否下载用于VS的调试符号
在这里插入图片描述



Visual Studio配置


  1. #include "D:\SoftWare\Python\include\Python.h"

    或者 包含一下Python.h所在路径(项目、属性、C/C++、附加包含目录:填写附加头文件(*.h)所在目录 分号间隔多项)。
  2. 包含

    python310_d.lib


    (项目、属性、链接器、附加库目录:填写附加依赖库(*.lib)所在目录 分号间隔多项;

    项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项)

    在这里插入图片描述



编程实现

建一个python文件

py_add.py

def add(a=1,b=1):
    print('Function of python called!')
    print('a = ',a)
    print('b = ',b)
    print('a + b = ',a+b)

在同目录下建C文件或者C++文件

main.cpp

#include <iostream>
#include "D:\SoftWare\Python\include\Python.h"

int main()
{
    std::cout << "Hello World!\n";
    Py_Initialize();/* 开始Python解释器 */
    if (!Py_IsInitialized())
    {
        printf("Python init failed!\n");
        return -1;
    }
    //PyRun_SimpleString 为宏,执行一段python代码
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");      //导入当前路径

    PyObject* pName = NULL;
    PyObject* pModule = NULL;
    PyObject* pDict = NULL;
    PyObject* pFunc = NULL;
    PyObject* pArgs = NULL;

    //加载名为py_add的python脚本 
   // pName = PyBytes_FromString("py_add");     
   /* pName = PyString_FromString("py_add");
    pModule = PyImport_Import(pName);
     //python>3.5,用下面函数导入
    pModule = PyImport_Import(PyUnicode_FromString("py_add"));
    if (!pModule)
    {
        printf("Load py_add.py failed!\n");
        getchar();
        return -1;
    }

    //获取模块字典属性
    pDict = PyModule_GetDict(pModule);
    if (!pDict)
    {
        printf("Can't find dict in py_add!\n");
        return -1;
    }

    //通过字典获取模块中的类
    pFunc = PyDict_GetItemString(pDict, "add");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        printf("Can't find function!\n");
        getchar();
        return -1;
    }
    /*
    向Python传参数是以元组(tuple)的方式传过去的,
    因此我们实际上就是构造一个合适的Python元组就
    可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数
    */
    pArgs = PyTuple_New(2);

    //  PyObject* Py_BuildValue(char *format, ...) 
    //  把C++的变量转换成一个Python对象。当需要从 
    //  C++传递变量到Python时,就会使用这个函数。此函数 
    //  有点类似C的printf,但格式不同。常用的格式有 
    //  s 表示字符串, 
    //  i 表示整型变量, 如Py_BuildValue("ii",123,456)
    //  f 表示浮点数, 
    //  O 表示一个Python对象
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 123));
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 321));

    //调用python的add函数
    PyObject_CallObject(pFunc, pArgs);

    //清理python对象
    if (pName)
    {
        Py_DECREF(pName);
    }
    if (pArgs)
    {
        Py_DECREF(pArgs);
    }
    if (pModule)
    {
        Py_DECREF(pModule);
    }
    Py_Finalize(); /* 结束Python解释器,释放资源 */


}

C/C++与python互相调用: https://blog.csdn.net/u012234115/article/details/50210835



版权声明:本文为weixin_42979021原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。