C++调用python脚本

2023-10-28

C++调用python的脚本

一. 为什么?

缘由:用python写了机器学习的模型,项目工程代码是C++写得,所以在调用时,想通过C++调用python脚本,用c++获取返回值。(然后就是一个接着一个的坑。。。。)

二. 环境

环境win10 64 + VS2008 debug win32平台 + python3.5 32位 (anaconda64位里面安装的,或者直接下载32位python3.5)

注意:32bit的python与win32的VS平台是必须对应的!!!!!!或者全为32或者全为64。建议使用32

  1. 在VS中新建一个win32的项目,名字叫CPython。

  2. 打开VS2008, 加入python的环境 具体操作包括,加入C与pyhton的交互引用包。一个是include ,一个libs。
    在这里插入图片描述
    在这里插入图片描述

  3. 找到你python 环境目录下的 D:\Anaconda3\envs\python35_32\include\pyconfig.h 文件 (很重要,如果运行下面文件报错的话,请参考后面的错误解决办法)

将 pragma comment(lib,"python35_d.lib")  修改为:  pragma comment(lib,"python35.lib")#  define Py_DEBUG 注释掉              修改为:  //#  define Py_DEBUG
  1. 编写测试用例 在CPython.cpp中调用python脚本文件,TestC.py,其中包含了一个Hello函数和一个test_add(测试传递参数与返回参数)函数 c++中 CPython项目下的CPython.cpp文件

    #include "stdafx.h"
    #include <Python.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {       //指定python.exe位置  python的环境。后来在迁移环境时,将include libs放在工程目录下,指定工程目录就可以
            Py_SetPythonHome(L"D:\\anaconda3\\envs\\python3");//指定python.exe位置需要修改成自己的  python的环境
            Py_Initialize();
            // 将当前目录加入sys.path  这两行的意思是你的主目录位置:是在工程目录下因此要把.py文件放到该目录下!。也可以自己定义
            PyRun_SimpleString("import sys");
            PyRun_SimpleString("sys.path.append('./')");
            // 导入hello.py模块
            PyObject *pmodule = PyImport_ImportModule("TestC");
            if (!pmodule)
            {
                   printf("can't find pytest.py");
                   return 1;
            }
            {
                   PyObject* pFunc = PyObject_GetAttrString(pmodule, "Hello");
                   PyEval_CallObject(pFunc, NULL);
                   Py_DECREF(pFunc);
            }
            {
                   PyObject* pv = PyObject_GetAttrString(pmodule, "test_add");
                   if (!pv || !PyCallable_Check(pv))
                   {
                           cout << "Can't find funftion (test_add)" << endl;
                           return 0;
                   }
                           cout << "Get function (test_add) succeed." << endl;
                   //初始化要传入的参数,args配置成传入两个参数的模式
                   PyObject* args = PyTuple_New(2);
                   //将Long型数据转换成Python可接收的类型
                   PyObject* arg1 = PyLong_FromLong(4);
                   PyObject* arg2 = PyLong_FromLong(3);
                   //将arg1配置为arg带入的第一个参数
                   PyTuple_SetItem(args, 0, arg1);
                   //将arg1配置为arg带入的第二个参数
                   PyTuple_SetItem(args, 1, arg2);
                   //传入参数调用函数,并获取返回值
                   PyObject* pRet = PyObject_CallObject(pv, args);
                   if (pRet)
                   {
                           //将返回值转换成long型
                           long result = PyLong_AsLong(pRet);
                           //cout << "result:" << result << endl ;
                   }
            }
      
            Py_DECREF(pmodule);
    
            Py_Finalize();
            return 0;
    }
    

    TestC.py文件 的内容 注意文件的空格与tab键。可以先将在pyhton环境下运行下,看是否出错。脚本文件一定不能出错!!!

    def Hello():
        print ('Hello')
        
    def test_add(a, b):
        print ('a+b')
        return a+b
    

    测试成功后,显示:

在这里插入图片描述

  1. 到此为止,你的环境算是布置成功了 (只是成功了一小步,╮(╯▽╰)╭)有问题的参考后面的解决方案!!!!!

  2. 下面你可能想要向python 传递列表、数组,并且以列表、数组的形式返回给C++调用。不要着急!!!!

    在python与c++的交互过程中,可以参考这里

三. 配置时遇到的问题

  1. 问题:

    error LNK2001: 无法解析的外部符号 __imp_PyString_FromString
    error LNK2001: 无法解析的外部符号 __imp_PyCallable_Check
    error LNK2001: 无法解析的外部符号 __imp_PyObject_CallObject
    error LNK2001: 无法解析的外部符号 __imp_Py_Initialize
    error LNK2001: 无法解析的外部符号 __imp_Py_IsInitialized
    error LNK2001: 无法解析的外部符号 __imp_PyImport_Import
    error LNK2001: 无法解析的外部符号 __imp_PyModule_GetDict

    解决办法: 开发环境 win7 x64 vs2008 64 python3.5 32位 出现上述问题是因为 python与 vs的开发环境位数不一致导致。更改py或 者vs平台一致即可

  2. 问题:

    1>CPython.obj : error LNK2019: 无法解析的外部符号__imp___Py_NegativeRefcount,该符号在函数_wmain 中被引用
    1>CPython.obj : error LNK2001: 无法解析的外部符号__imp___Py_RefTotal

    解决办法: 修改配置文件 python目录\include\pyconfig.h 一定要!!! 注释掉 //# define Py_DEBUG

  3. 问题:

    fatal error C1083: 无法打开包括文件:“inttypes.h”: No such file or directory,缺什么,去下载什么。下载文件安装到VC的目录下,再次执行,直接命令框死掉xxx00000。

    解决办法:个人感觉是版本原因,可能你的计算机缺什么文件。建议重新安装其他本版本最好都是32位的,纯净的python+vs。甚至系统

  4. 问题:

    无法启动此程序,因为计算机中丢失python35.dll。 尝试重新安装该程序以解决此问题。

    解决方案:去python目录下找到python35.dll,复制到C:\Windows\SysWOW64 中,也可以尝试放在c++工程目录下

  5. 问题

    python35_d.dll 出错

    解决方案: 找到你python 环境目录下的 D:\Anaconda3\envs\python35_32\include\pyconfig.h 文件 (很重要,如果运行下面文件报错的话,请参考后面的错误解决办法

    将 pragma comment(lib,“python35_d.lib”) 修改为: pragma comment(lib,“python35.lib”)

    将 # define Py_DEBUG 注释掉 //# define Py_DEBUG

  6. 问题:

    运行程序,出现no moudle…问题。

    解决方案:是环境问题,在cpython.cpp中加入 Py_SetPythonHome(L"D:\anaconda3\envs\python3");//指定python.exe位置(这里指定的conda中的一个32位python的虚拟环境)

  7. 问题:

    [ERROR] Python get module failed. 在加载模块时, PyObject *pmodule = PyImport_ImportModule(“TestC”);
    解决办法: py文件中错误,查看是否有空格与tab键不一致,是否有加载其他的外部包,尝试去掉所有的import。

  8. 问题: PyInt_AsLong PyString_FromString 这些函数报错。

    解决办法:py3 用PyBytes_FromString 代替PyString_FromString PyLong_AsLong代替PyInt_AsLong。其他的可以去搜一下具体用法。

  9. 问题: nullptr 报错 error C2065: “nullptr”: 未声明的标识符
    解决办法: C++11好像才有,现在 报错 直接为空就好了NULL

  10. 问题:from _ctypes import Union, Structure, Array DLLload failed找不到指定的程序

    或者multiarray 导入错误什么的,ImportError: numpy.core.multiarray failed to import,

    原始是在c++程序中有一句import_array(); 找不到合适的numpy版本

    解决办法:确认python的版本位数numpy的版本位数都是32位,并在工程中导入numpy的地址,如下:

在这里插入图片描述

四. c++与python数据交互案例(完整的工程代码)

除了上面举得安装环境时的测试例子,还有一种交互方式,比较方便通用。下面展示的是在c++中调用python写的BP神经网络函数,并传入参数,最后在c++中接收返回结果。

c++传递数据到python中:

//初始化
Py_SetPythonHome(L"D:\\anaconda3\\envs\\python3");//指定python.exe位置
Py_Initialize();   //初始化

PyRun_SimpleString("print ('Hello')");
import_array();

//指定脚本文件TestC的位置,在该cpp工程文件目录下
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pmodule = PyImport_ImportModule("TestC");

//调用指定模块
PyObject* pFunc = PyObject_GetAttrString(pmodule, "BP_Model");

//data_file, test_size=0.3, hidden_layer_sizes=(100,), activation='relu', learning_rate_init=0.0005,  max_iter=1000, tol=1e-5
//传递参数 字符串、整形、double类型
char * cFilePath = "data\\hoston_DataImport_Temp.csv";
PyObject* args = PyTuple_New(7);
PyObject* arg0 = Py_BuildValue("s", cFilePath); // 文件路径
PyObject* arg1 = Py_BuildValue("d",0.3);		// 验证集比例
PyObject* arg2 = Py_BuildValue("s","100,100"); // 隐藏层节点数
PyObject* arg3 = Py_BuildValue("s", "relu"); // 激活函数
PyObject* arg4 = Py_BuildValue("d", 0.005); // 学习率
PyObject* arg5 = Py_BuildValue("i", 10000000); // 迭代次数	
PyObject* arg6 = Py_BuildValue("d",0.0000000000001); // 迭代停止条件误差小于1e-5

PyTuple_SetItem(args, 0, arg0);
PyTuple_SetItem(args, 1, arg1);
PyTuple_SetItem(args, 2, arg2);
PyTuple_SetItem(args, 3, arg3);
PyTuple_SetItem(args, 4, arg4);
PyTuple_SetItem(args, 5, arg5);
PyTuple_SetItem(args, 6, arg6);
//返回调用结果
PyObject* pyResult = PyObject_CallObject(pFunc, args);

//解析返回结果,含有多个字符串结果。
char *ret1 ;
char *ret2;
PyArg_ParseTuple(pyResult,"ss", &ret1,&ret2);
Py_DECREF(pyResult);
printf("\nBPreturn value: 模型:%s, 误差:%s", ret1,ret2);
Py_DECREF(pFunc);

TestC.py文件在当前工程目录下:

#coding = utf-8
'''
=============================================
    File Name:     TestC1
    Email:         xxxx
    Author :       zzl
    Date:         2020/06/15
    Description :
=============================================
'''
def BP_Model(data_file, test_size=0.3, hidden_layer_sizes='100', activation='relu', learning_rate_init=0.0005,
             max_iter=1000, tol=1e-5):
    '''
    BP神经网络模型训练
    Args:
        data_file: 传入的文件地址
        test_size: 验证集比例
        hidden_layer_sizes: 隐藏层节点数(字符串),后期对字符串进行处理转化成tuple
        activation: 激活函数
        learning_rate_init: 学习率
        max_iter: 最大迭代次数
        tol: 模型停止条件
    Return:
        str: 训练后的模型地址
        error: 验证集误差
    '''
	数据读取
	模型训练
	返回结果
    return s_, error

详细代码

五. c++与python模块间的相互调用

上面所使用的过程都是用c++想要调用python的函数,这样做的目的是,python对分析、应用、算法的拓展上比较方便,而c++在运行速度和工程化上有着无可比拟的优势(python是拿c写的,想像一下,我用python写了一个算法,然后内部是调用c的函数,然后再转化成汇编,跟c直接转化成汇编,哪个快?)。除了上面的一种数据交互方式,boost的python也可以进行交互C++和Python混合编程第五期:C++调用Python脚本的简单方法

在实际使用中,还有一种应用方式,就是用c++来写底层算法,编译成python可以用的模块,在使用时直接调用这些模块,大大加快的运算速度,有很多的深度学习框架底层都是c++实现的,然后给python留了接口,模块。在实际的应用中,还是这种应用方式比较普遍。

另外在电脑上将cpp打包dll时,将项目 配置属性->常规->配置类型->动态库 即可在win10上打包dll库。

下面举一个例子来说明python调用C++实例:用C++对numpy执行BFS(广度优先搜索)

用python实现BFS: 最终程序运行0.914s

用C++实现BFS: 形成一个cpp文件, 下面我们看怎样用python调用cpp。

  1. 在上文的cpp中,对想要执行的函数fillHole先进行声明:
  2. 用g++(mingw64位)编译为dll:
  3. 在python中使用numpy的封装加载DLL并且传参调用:

程序执行了0.058秒,根据测试cpp比python快了15倍。

六. 引用

  1. 多维数组Numpy.Array()在Python和C/C++文件间的传递问题 https://blog.csdn.net/stu_csdn/article/details/69488385
  2. c++接受python的array返回值 https://docs.scipy.org/doc/numpy/reference/c-api.array.html
  3. C++使用Py*调用Python3模块中 https://www.jianshu.com/p/c9f5f4ce3e7a?utm_campaign=maleskine
  4. VS2019 C++ 调用python函数/类对象的方法 https://blog.csdn.net/omg_orange/article/details/100106926
  5. C++调用python的那些坑(详细教程 https://blog.csdn.net/qq_38275373/article/details/91367372
  6. C++调用Python浅析 https://blog.csdn.net/magictong/article/details/8947892
  7. 浅析C++调用Python模块 https://blog.csdn.net/tobacco5648/article/details/50890106
  8. 在其他应用程序中嵌入 https://docs.python.org/2/extending/embedding.html
  9. C/C++调用Python OpenCV与Numpy https://blog.csdn.net/ziweipolaris/article/details/83689597
  10. python与CC++的交互(一) https://blog.csdn.net/guxch/article/details/80332821
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++调用python脚本 的相关文章

  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 如何读取Python字节码?

    我很难理解 Python 的字节码及其dis module import dis def func x 1 dis dis func 上述代码在解释器中输入时会产生以下输出 0 LOAD CONST 1 1 3 STORE FAST 0 x
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • 检查字典键是否有空值

    我有以下字典 dict1 city name yass region zipcode phone address tehsil planet mars 我正在尝试创建一个基于 dict1 的新字典 但是 它不会包含带有空字符串的键 它不会包
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 104个精选计算机毕业设计项目,助你制作出色的程序,一定要试试

    对于即将面临毕业设计的计算机专业的同学们 如何选题和完成毕设项目成为一个重要而又棘手的问题 今天给大四的同学分享毕业设计项目 希望对正在为毕业设计发愁的小伙伴有帮助 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传
  • rpmbuild制作包的详细过程

    https www cnblogs com schangech p 5641108 html https www ibm com developerworks cn linux l rpm 一 目录结构生成 1 工具安装rpmdevtool
  • STM32之中断和事件

    中断和事件 什么是中断 当CPU正在执行程序时 由于发生了某种事件 要求CPU暂时中断当前的程序执行 转而去处理这个随机事件 处理完以后 再回到原来被中断的地方 继续原来的程序执行 这样的过程称为中断 什么是事件 当检测到某一个动作的触发
  • 内网 centos7 离线安装rpm包的三种方法

    一 使用 downloadonly参数 此种方法的优点是下载的rpm包可以下载至同一目录中 一 互联网电脑下载rpm包 1 查看互联网电脑是否支持 只下载不安装 功能 执行yum帮助命令 yum help 如果列表中出现 downloado
  • 文件操作之文件包含全解(31)

    文件包含的作用就是将这个文件包含进去之后 会调用指定文件的代码 先将文件包含才能执行里面的一些相关代码 比如所想进行文件的链接 数据库的查询 就可以先包含一个数据库的配置文件 再去链接的话就享有配置文件的一些配置信息 就不需要在进行相关的操
  • stegsolve图片隐写解析器的使用

    layout post title ctf 隐写图片解析器 stegsolve的使用 categories ctf tags stegsolve CTF隐写术 隐写图片解析神器 stegsolve stegsolve下载地址 http ww
  • 静态测试和动态测试相关知识点

    目 录 知识总结 5 第一章 5 第二章软件测试基础 5 第三章基于生命周期的软件测试 6 第四章软件测试的分类 6 第五章软件缺陷管理 6 第六章软件测试过程及其管理 7 静态测试 7 1
  • ubunt 上进行c++ cuda编程

    目录 概述 cmake代码 头文件代码 头文件对应的cuda代码实现 c 的代码 运行结果 参考资料 概述 首先先通过一个简单的demo来演示cuda编程是怎么进行的 cmake代码 cmake minimum required VERSI
  • 替换docker容器中的文件

    bin bash 宣告文件内的语法使用bash语法 于是当程序执行时 加载bash的相关环境配置文件 在shell脚本中 倒引号 括起来的表示要执行的命令 dirname 0 获取当前shell程序的路径 cd dirname 0 进入当前
  • ES6中const的使用

    const声明一个只读的常量 一旦声明 常量的值就不能改变 且const一旦声明变量 就必须立即初始化 不能留到以后赋值 const的作用域与let命令相同 只在声明所在的块级作用域内有效 const命令声明的常量也是不提升 同样存在暂时性
  • 目标检测:划分数据集,生成ImageSets\Main下的txt文档

    coding utf 8 Time 2020 6 1 Author WangKaiNing File xml2voc py import os import random 可能需要修改的地方 g root path D AAAAA bigd
  • Linux报错:tar: Error Is Not Recoverable: Exiting Now

    Linux操作系统下 下载完成xx tar gz文件然后执行tar zxvf xx tar gz 执行出现如下错误 xxx tar gz 归档文件中异常的 EOF tar 归档文件中异常的 EOF tar Error is not reco
  • 「ML 实践篇」分类系统:图片数字识别

    目的 使用 MNIST 数据集 建立数字图像识别模型 识别任意图像中的数字 文章目录 1 数据准备 MNIST 2 二元分类器 SGD 3 性能测试 1 交叉验证 2 混淆矩阵 3 查准率与查全率 4 P R 曲线 5 ROC 曲线 6 R
  • ActiveX控件开发、部署、使用(全)

    本文基于MFC的ActiveX控件开发 很大程度上和基于ALT的ActiveX控件编写有相同之处 首先创建基于MFC的ActiveX控件 OK一路下一步 完成 添加与外部接口 ClassView Lib Events ADD method
  • 51单片机c语言dac0832产生波形,单片机控制DAC0832产生各种波形Proteus仿真程序

    include sbit wr P3 6 sbit rd P3 2 sbit key0 P1 0 定义P1 0脚的按键为正弦波键key0 sbit key1 P1 1 定义P1 1脚的按键为方波键key1 sbit key2 P1 2 定义
  • Kafka 面试套路居然这样多!读完大神的 Kafka 核心手册,秒杀面试官!全网最强!!

    在热招的 Java 架构师岗位面试中 Kafka 面试题被面试官选中的几率非常大 也是 HR 的杀手锏和狠招 一般来讲 面试题有以下几种 Kafka 为什么这么快 如何对 Kafka 集群进行调优 Kafka 的高性能网络架构是如何设计的
  • 【JavaScript】详解JavaScript中的replace()函数

    replace 1 方法简介 2 replace 使用 2 1 replace 字符串 字符串 2 2 replace 正则表达式 字符串 2 3 replace 正则表达式 function 2 3 1 简单用法 正则表达式不使用分组 2
  • QString 和char *和QByteArray的转换总结

    参考博客 https www cnblogs com findumars p 5107700 html 以下内容摘抄以上大神博客 1 char转换为QString char a b QString str str QString a 2 Q
  • 为 openEuler 安装 桌面环境图形化界面【ukui】

    三 UKUI 图形化界面 3 1 安装图形化界面 ukui 由于openEuler只有命令行操作界面 所以我们可以给openEuler安装一个桌面图形环境 最近华为发布了一个适用于openEuler的图形化界面 叫作UKUI 3 1 1 首
  • C++调用python脚本

    C 调用python的脚本 一 为什么 缘由 用python写了机器学习的模型 项目工程代码是C 写得 所以在调用时 想通过C 调用python脚本 用c 获取返回值 然后就是一个接着一个的坑 二 环境 环境win10 64 VS2008