C++(MFC)调用Python
环境:
phyton版本:3.10
VS版本:VS2017
包含文件头:Python\Python310\include
包含库文件:Python\Python310\libs
程序运行期间,以下函数只需要调用一次即可,重复调用会导致崩溃
void Initialize();
void Finalize();
“C_Test.py”需要拷贝程序运行所有的目录。
下载:https://download.csdn.net/download/luo_sen/88094131
PythonHelper.h
#pragma once
#include<string>
using namespace std;
/*
phyton版本:3.10
包含文件头:Python\Python310\include
包含库文件:Python\Python310\libs
*/
// https://docs.python.org/3/c-api/arg.html
/*
b (int) [unsigned char]
Convert a nonnegative Python integer to an unsigned tiny int, stored in a C unsigned char.B (int) [unsigned char]
Convert a Python integer to a tiny int without overflow checking, stored in a C unsigned char.h (int) [short int]
Convert a Python integer to a C short int.H (int) [unsigned short int]
Convert a Python integer to a C unsigned short int, without overflow checking.i (int) [int]
Convert a Python integer to a plain C int.I (int) [unsigned int]
Convert a Python integer to a C unsigned int, without overflow checking.l (int) [long int]
Convert a Python integer to a C long int.k (int) [unsigned long]
Convert a Python integer to a C unsigned long without overflow checking.L (int) [long long]
Convert a Python integer to a C long long.K (int) [unsigned long long]
Convert a Python integer to a C unsigned long long without overflow checking.n (int) [Py_ssize_t]
Convert a Python integer to a C Py_ssize_t.c (bytes or bytearray of length 1) [char]
Convert a Python byte, represented as a bytes or bytearray object of length 1, to a C char.Changed in version 3.3: Allow bytearray objects.C (str of length 1) [int]
Convert a Python character, represented as a str object of length 1, to a C int.f (float) [float]
Convert a Python floating point number to a C float.d (float) [double]
Convert a Python floating point number to a C double.D (complex) [Py_complex]
Convert a Python complex number to a C Py_complex structure.
*/#define PYTHON_FILE_NAME _T("C_Test")extern "C"
{
#include "Python.h"
}class CPythonHelper
{public:void Initialize();void Finalize();PyObject* GetPyFunc(CString strModuleName, CString strFuncName); PyObject* RunPyFunc(CString strModuleName, CString strFuncName, PyObject *pArgs);int PyTupleSetItem(PyObject *, Py_ssize_t, PyObject *);CString PyObjectToCString(PyObject *pPyObj);int PyObjectToInt(PyObject *pPyObj);double PyObjectToFloat(PyObject *pPyObj);int PyObjectToFloatArray(PyObject *pPyObj, CArray<double, double>& szData);PyObject* IntToPyObject(int data);PyObject* FloatToPyObject(double data);PyObject* CStringToPyObject(CString data);PyObject* FloatArrayToPyObject(CArray<double, double> &szData);PyObject* CreateArgs(int size);protected:string UTF8_To_string(const std::string & str);string string_To_UTF8(const std::string & str);string CStringToPyString(CString text);PyObject* GetPyFunc(char* pModuleName, char* pFuncName);PyObject* RunPyFunc(char* pModuleName, char* pFuncName, PyObject *pArgs);};
PythonHelper.cpp
#include "pch.h"
#include "PythonHelper.h"std::string CPythonHelper::UTF8_To_string(const std::string & str)
{int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 memset(pwBuf, 0, nwLen * 2 + 2);MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char * pBuf = new char[nLen + 1];memset(pBuf, 0, nLen + 1);WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr = pBuf;delete[]pBuf;delete[]pwBuf;pBuf = NULL;pwBuf = NULL;return retStr;
}
std::string CPythonHelper::string_To_UTF8(const std::string & str)
{int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 ZeroMemory(pwBuf, nwLen * 2 + 2);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char * pBuf = new char[nLen + 1];ZeroMemory(pBuf, nLen + 1);::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr(pBuf);delete[]pwBuf;delete[]pBuf;pwBuf = NULL;pBuf = NULL;return retStr;
}string CPythonHelper::CStringToPyString(CString text)
{string tt = CT2A(text);string strUTF8 = string_To_UTF8(tt);return strUTF8;
}CString CPythonHelper::PyObjectToCString(PyObject *pPyObj)
{PyObject* str = PyUnicode_AsEncodedString(pPyObj, "utf-8", "Error");char *result = (PyBytes_AsString(str));string temp = UTF8_To_string(result);CString strResult = CString(temp.c_str());return strResult;
}
int CPythonHelper::PyObjectToInt(PyObject *pPyObj)
{int data = 0;PyArg_Parse(pPyObj, "i", &data);return data;
}
double CPythonHelper::PyObjectToFloat(PyObject *pPyObj)
{double data = 0;PyArg_Parse(pPyObj, "d", &data);return data;
}int CPythonHelper::PyObjectToFloatArray(PyObject *pPyObj, CArray<double, double>& szData)
{szData.RemoveAll();int SizeOfList = PyList_Size(pPyObj);for (int i = 0; i < SizeOfList; i++){PyObject *Item = PyList_GetItem(pPyObj, i);double result=0;PyArg_Parse(Item, "d", &result);szData.Add(result);}return SizeOfList;}void CPythonHelper::Initialize()
{if (!Py_IsInitialized()){Py_Initialize();}}void CPythonHelper::Finalize()
{if (Py_IsInitialized()){Py_Finalize();}}
PyObject* CPythonHelper::GetPyFunc(CString strModuleName, CString strFuncName)
{string pModuleName = CStringToPyString(strModuleName);string pFuncName = CStringToPyString(strFuncName);return GetPyFunc((char*)pModuleName.c_str(), (char*)pFuncName.c_str());}PyObject* CPythonHelper::GetPyFunc(char* pModuleName, char* pFuncName)
{PyObject *pModule = PyImport_ImportModule(pModuleName);PyObject *pFunc = PyObject_GetAttrString(pModule, pFuncName);//Py_CLEAR(pModule);return pFunc;
}PyObject * CPythonHelper::RunPyFunc(char* pModuleName, char* pFuncName, PyObject *pArgs)
{PyObject *pFunc = GetPyFunc(pModuleName, pFuncName);PyObject *pRetrun = PyObject_CallObject(pFunc, pArgs); //Py_CLEAR(pFunc);return pRetrun;
}
PyObject * CPythonHelper::RunPyFunc(CString strModuleName, CString strFuncName, PyObject *pArgs)
{string pModuleName = CStringToPyString(strModuleName);string pFuncName = CStringToPyString(strFuncName);PyObject *pRetrun = RunPyFunc((char*)pModuleName.c_str(), (char*)pFuncName.c_str(), pArgs); return pRetrun;
}
int CPythonHelper::PyTupleSetItem(PyObject * pObject, Py_ssize_t index, PyObject * pData)
{return PyTuple_SetItem(pObject, index, pData);
}PyObject* CPythonHelper::IntToPyObject(int data)
{return Py_BuildValue("i", data);
}
PyObject* CPythonHelper::FloatToPyObject(double data)
{return Py_BuildValue("d", data);
}PyObject* CPythonHelper::FloatArrayToPyObject(CArray<double, double> &szData)
{int nSize = szData.GetSize();PyObject *PyList = PyList_New(nSize);for (int i = 0; i < PyList_Size(PyList); i++){PyList_SetItem(PyList, i, PyFloat_FromDouble(szData[i]));}return PyList;
}
PyObject* CPythonHelper::CStringToPyObject(CString data)
{return Py_BuildValue("s", (CStringToPyString(data).c_str())); }PyObject* CPythonHelper::CreateArgs(int size)
{return PyTuple_New(size);
}
C_Test.py
def Hello():print("hello Python")def Add(a,b):import numpy as npprint(np.pi)return a+bdef GetText(msg):print(msg)return msg;
程序调用示例-整数(一):
CPythonHelper PY;PY.Initialize();int a = 10;int b = 20;int sum = 0; //参数设置PyObject *pArgs = PyTuple_New(2);PY.PyTupleSetItem(pArgs, 0,Py_BuildValue("i", a));PY.PyTupleSetItem(pArgs, 1, Py_BuildValue("i", b));//调用函数PyObject *pRetrun = PY.RunPyFunc(PYTHON_FILE_NAME, _T("Add"), pArgs);//返回值转换PyArg_Parse(pRetrun, "i", &sum);//输出CString strResult = _T("");strResult.Format(_T("%d+%d=%d"), a, b, sum);AfxMessageBox(strResult);PY.Finalize();
程序调用示例-字符串(二)
CPythonHelper PY;PY.Initialize();CString strText = _T("ABC中国人123");//参数设置PyObject *pArgs = PyTuple_New(1);PY.PyTupleSetItem(pArgs, 0, Py_BuildValue("s", PY.CStringToPyString(strText).c_str()));//调用函数PyObject *pRetrun = PY.RunPyFunc(PYTHON_FILE_NAME, _T("GetText"), pArgs);//返回值转换CString strResult = PY.PyObjectToCString(pRetrun);//输出AfxMessageBox(strResult);PY.Finalize();
程序调用示例-数组(三)
CPythonHelper PY;PY.Initialize();CString strText = _T("ABC中国人123");//参数设置PyObject *pArgs = PY.CreateArgs(1);PyObject* pObject = PY.CStringToPyObject(strText);CArray<double, double> szData;szData.Add(1.0);szData.Add(1.1);szData.Add(2);PyObject *PyList = PY.FloatArrayToPyObject(szData);PY.PyTupleSetItem(pArgs, 0, PyList);//调用函数PyObject *pReturn = PY.RunPyFunc(PYTHON_FILE_NAME, _T("SetVaule"), pArgs);//返回值转换PY.PyObjectToFloatArray(pReturn, szData);PY.Finalize();
相关文章:
C++(MFC)调用Python
环境: phyton版本:3.10 VS版本:VS2017 包含文件头:Python\Python310\include 包含库文件:Python\Python310\libs 程序运行期间,以下函数只需要调用一次即可,重复调用会导致崩溃 void Initial…...
深度学习实践——循环神经网络实践
系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 代码可见于: 深度学习实践——循环神经网络实践 0 概况1 架构实现1.1 RNN架构1.1.1 RNN架…...
docker简单web管理docker.io/uifd/ui-for-docker
要先pull这个镜像docker.io/uifd/ui-for-docker 这个软件默认只能使用9000端口,别的不行,因为作者在镜像制作时已加入这一层 刚下下来镜像可以通过docker history docker.io/uifd/ui-for-docker 查看到这个端口已被 设置 如果在没有设置br0网关时&…...
SpringBoot内嵌的Tomcat:
SpringBoot内嵌Tomcat源码: 1、调用启动类SpringbootdemoApplication中的SpringApplication.run()方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplicat…...
企业级docker应用注意事项
现在很多企业使用容器化技术部署应用,绕不开的docker技术,在生产环境docker常用操作总结。参考:https://juejin.cn/post/7259275893796651069 1. 尽可能使用官方镜像 在docker hub 官方 使用后面带有 DOCKER OFFICIAL IMAGE 标签的镜像&…...
腾讯云高性能计算集群CPU服务器处理器说明
腾讯云高性能计算集群以裸金属云服务器为节点,通过RDMA互联,提供了高带宽和极低延迟的网络服务,能满足大规模高性能计算、人工智能、大数据推荐等应用的并行计算需求,腾讯云服务器网分享腾讯云服务器高性能计算集群CPU处理器说明&…...
tinkerCAD案例:23.Tinkercad 中的自定义字体
tinkerCAD案例:23.Tinkercad 中的自定义字体 原文 Tinkercad Projects Tinkercad has a fun shape in the Shape Generators section that allows you to upload your own font in SVG format and use it in your designs. I’ve used it for a variety of desi…...
Box-Cox 变换
Box-cox 变化公式如下: y ( λ ) { y λ − 1 λ λ ≠ 0 l n ( y ) λ 0 y^{(\lambda)}\left\{ \begin{aligned} \frac{y^{\lambda} - 1}{\lambda} && \lambda \ne 0 \\ ln(y) && \lambda 0 \end{aligned} \right. y(λ)⎩ ⎨ ⎧λyλ−1ln…...
Linux wc命令用于统计文件的行数,字符数,字节数
Linux wc命令用于计算字数。 利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。 语法 wc [-clw][–help][–version][文件…] 参数: -c或–b…...
Python读取多个栅格文件并提取像元的各波段时间序列数据与变化值
本文介绍基于Python语言,读取文件夹下大量栅格遥感影像文件,并基于给定的一个像元,提取该像元对应的全部遥感影像文件中,指定多个波段的数值;修改其中不在给定范围内的异常值,并计算像元数值在每一景遥感影…...
Linux 之 wget curl
wget 命令 wget是非交互式的文件下载器,可以在命令行内下载网络文件 语法: wget [-b] url 选项: -b ,可选,background 后台下载,会将日志写入到 当前工作目录的wget-log文件 参数 url : 下载链…...
AngularJS 和 React区别
目录 1. 背景:2. 版本:3. 应用场景:4. 语法:5. 优缺点:6. 代码示例: AngularJS 和 React 是两个目前最为流行的前端框架之一。它们有一些共同点,例如都是基于 JavaScript 的开源框架,…...
【Solr】Solr搜索引擎使用
文章目录 一、什么是Solr?二 、数据库本身就支持搜索啊,干嘛还要搞个什么solr?三、如果我们想要使用solr那么首先我们得安装它 一、什么是Solr? 其实我们大多数人都使用过Solr,也许你不会相信我说的这句话,但是事实却是如此啊 ! 每当你想买自己喜欢的东东时,你可能会打开某…...
一起学算法(选择排序篇)
距离上次更新已经很久了,以前都是非常认真的写笔记进行知识分享,但是带来的情况并不是很好,一度认为发博客是没有意义的,但是这几天想了很多,已经失去了当时写博客的初心了,但是我觉得应该做点有意义的事&a…...
智能体的主观和能动
摘要 智能体的主动性是提升智能机器的能力的关键。围绕智能体的主动性存在很多思想迷雾,本文继续我们以前的工作,试图清理这些概念上的问题。我们的讨论显示:要研究主动性,并不一定需要研究意识,仅需要研究主观和能动就…...
AB 压力测试
服务器配置 阿里云Ubuntu 64位 CPU1 核 内存2 GB 公网带宽1 Mbps ab -c100 -n1000 http://127.0.0.1:9501/ -n:在测试会话中所执行的请求个数。默认时,仅执行一个请求。 -c:一次产生的请求个数。默认是一次一个。 ab -c 100 -n 200 ht…...
多旋翼物流无人机节能轨迹规划(Python代码实现)
目录 💥1 概述 📚2 运行结果 🌈3 Python代码实现 🎉4 参考文献 💥1 概述 多旋翼物流无人机的节能轨迹规划是一项重要的技术,可以有效减少无人机的能量消耗,延长飞行时间,提高物流效率…...
Vue通过指令 命令将打包好的dist静态文件上传到腾讯云存储桶 (保存原有存储目录结构)
1、在项目根目录创建uploadToCOS.js文件 (建议起简单的名字 方便以后上传输入命令方便) 2、uploadToCOS.js文件代码编写 const path require(path); const fs require(fs); const COS require(cos-nodejs-sdk-v5);// 配置腾讯云COS参数 const cos n…...
Linux 新硬盘分区,挂载
在Linux系统中,当你插入新的硬盘时,你需要进行一些步骤来使系统识别并使用它。以下是一些常见的步骤: 确保硬盘已正确连接到计算机。检查硬盘的电源和数据线是否牢固连接。 打开终端或命令行界面。 运行以下命令来扫描新硬盘: s…...
Stable Diffusion 开源模型 SDXL 1.0 发布
关于 SDXL 模型,之前写过两篇: Stable Diffusion即将发布全新版本Stable Diffusion XL 带来哪些新东西? 一晃四个月的时间过去了,Stability AI 团队终于发布了 SDXL 1.0。当然在这中间发布过几个中间版本,分别是 SDXL …...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
