zoukankan      html  css  js  c++  java
  • C++ 调用Python脚本

    本人环境

    Windows10;

    python3.7.4;

    visual studio 2019;

    安装python,opencv(如果用到的话),以及将二者目录添加到vs中的包含目录和库目录就不再说了。教程一大堆,自己配置好。以下步骤都建立在这些环境配置成功之后。

    重要

    将Python安装目录下的includelibs文件夹引入到项目中
    libs目录下的python37.lib复制一份为python37_d.lib

    一、Python脚本

    这个python脚本和C++编译成功后生成的.exe文件放在同一目录下。

    def Hello():
        print("Hello")
        
    def Add(a,b):
        return  a+b

     

    二、C++调用python脚本

    #include <Python.h>
    using namespace std;
    
    int main()
    {
    	Py_Initialize();              //初始化,创建一个Python虚拟环境
    	if (Py_IsInitialized())
    	{
    		PyObject* pModule = NULL;
    		PyObject* pFunc = NULL;
    		pModule = PyImport_ImportModule("test_python");  //参数为Python脚本的文件名
    		if (pModule)
    		{
    			pFunc = PyObject_GetAttrString(pModule, "Hello");   //获取函数
    			PyEval_CallObject(pFunc, NULL);           //执行函数
    		}
    		else
    		{
    			printf("导入Python模块失败...
    ");
    		}
    	}
    	else
    	{
    		printf("Python环境初始化失败...
    ");
    	}
    	Py_Finalize();
    }
    

    需要将Python安装目录下的LibDlls放到程序运行目录下,并添加Python37.dll到运行目录即可(我是这么做的)。

     

    运行结果:

    ok,成功调用python脚本。

    附上C++调用python的一些规范化语句:

    #include<Python.h> //添加python的声明
    
    using namespace std;
    
    int main()
    {
    Py_Initialize(); //1、初始化python接口
    
    //初始化使用的变量
    PyObject* pModule = NULL;
    PyObject* pFunc = NULL;
    PyObject* pName = NULL;
    
    //2、初始化python系统文件路径,保证可以访问到 .py文件
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    
    //3、调用python文件名。当前的测试python文件名是test.py。在使用这个函数的时候,只需要写文件的名称就可以了。不用写后缀。
    pModule = PyImport_ImportModule("test");
    
    //4、调用函数
    pFunc = PyObject_GetAttrString(pModule, "AdditionFc");
    
    //5、给python传参数
    PyObject* pArgs = PyTuple_New(2);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数。如果AdditionFc中只有一个参数时,写1就可以了。这里只先介绍函数必须有参数存在的情况。
    
    
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2)); //0:表示序号。第一个参数。
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4)); //1:也表示序号。第二个参数。i:表示传入的参数类型是int类型。
    
    //6、使用C++的python接口调用该函数
    PyObject* pReturn = PyEval_CallObject(pFunc, pArgs);
    
    //7、接收python计算好的返回值
    int nResult;
    PyArg_Parse(pReturn, "i", &nResult);//i表示转换成int型变量。在这里,最需要注意的是:PyArg_Parse的最后一个参数,必须加上“&”符号。
    
    //8、结束python接口初始化
    Py_Finalize();
    }
    

      

  • 相关阅读:
    C# 中Async 和 Await 的用法,异步等待执行结果
    C# 事件发布和订阅
    C# 多线程使用信号量控制处理效率,统计活动中的线程
    C# 委托和泛型委托示例
    C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数
    WinRar DOS命令大全带详细参数rar/zip/7z压缩文件解密
    Magic.Orm 基于C#的ORM框架,支持Sql Server/MySql/Oracle/Access/Sqlite等数据库,支持Lambda表达式快速上手0难度
    SqlServer使用SqlBulkCopy批量新增和更新数据,快速高效
    Flink内存模型
    Linux 查找替换
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/11466241.html
Copyright © 2011-2022 走看看