C++调用Python

Python安装

地址: python官网
官网

可以根据需要下载对应的版本。

调用python

python测试脚本

# my_script.py
import sys
import jsondef calculate(a, b):return a * b + 10  # 示例计算逻辑if __name__ == "__main__":# 从命令行参数读取 JSON 字符串try:args = json.loads(sys.argv[1])a = args['a']b = args['b']result = calculate(a, b)# 输出 JSON 格式结果print(json.dumps({"result": result}))except Exception as e:print(json.dumps({"error": str(e)}), file=sys.stderr)sys.exit(1)

调用方式:

脚本直接调用

通过写python成脚本,运行python解释器并运行对应的脚本,执行对应的任务,如果是跟自己程序不需要进行通讯的,这种方式是最好的,不涉及参数的传输。
通过json结构来传入程序运行数据。并通过接收终端打印信息解析回数据。

#include <QProcess>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>void callPythonScript() {QProcess pythonProcess;// 定义参数(例如 a=5, b=3)QJsonObject params;params["a"] = 5;params["b"] = 3;QString jsonArgs = QJsonDocument(params).toJson(QJsonDocument::Compact);// 启动 Python 进程pythonProcess.start("python", QStringList() << "my_script.py" << jsonArgs);if (!pythonProcess.waitForFinished()) {qDebug() << "Python 进程执行超时或出错";return;}// 读取标准输出QByteArray output = pythonProcess.readAllStandardOutput();QJsonDocument resultDoc = QJsonDocument::fromJson(output);if (resultDoc.isObject()) {QJsonObject resultObj = resultDoc.object();if (resultObj.contains("result")) {int result = resultObj["result"].toInt();qDebug() << "计算结果:" << result;  // 输出:计算结果:25 (5*3+10)} else if (resultObj.contains("error")) {qDebug() << "Python 错误:" << resultObj["error"].toString();}} else {qDebug() << "无法解析 Python 输出:" << output;}
}

通过嵌入Python调用

python提供了C语言的API,可以通过C语言来调用Python。

#include <Python.h>
#include <QCoreApplication>
#include <QDebug>void callEmbeddedPython() {Py_Initialize();// 1. 添加脚本目录到 sys.pathQString scriptDir = "D:/test";PyRun_SimpleString("import sys");PyRun_SimpleString(qPrintable(QString("sys.path.append('%1')").arg(scriptDir)));// 2. 导入模块(模块名 = 文件名不含 .py)PyObject *pModule = PyImport_ImportModule("my_script");if (!pModule) {PyErr_Print();qDebug() << "模块导入失败,请检查:"<< "\n- 文件路径: " << scriptDir + "/my_script.py"<< "\n- Python 环境: 当前解释器版本为 " << Py_GetVersion();Py_Finalize();return;}// 3. 调用函数PyObject *pFunc = PyObject_GetAttrString(pModule, "calculate");if (pFunc && PyCallable_Check(pFunc)) {PyObject *pArgs = PyTuple_New(2);PyTuple_SetItem(pArgs, 0, PyLong_FromLong(5));PyTuple_SetItem(pArgs, 1, PyLong_FromLong(3));PyObject *pResult = PyObject_CallObject(pFunc, pArgs);if (pResult) {qDebug() << "[嵌入式] 结果:" << PyLong_AsLong(pResult);Py_DECREF(pResult);}Py_DECREF(pArgs);Py_DECREF(pFunc);} else {PyErr_Print();qDebug() << "函数 calculate 未找到或不可调用";}Py_DECREF(pModule);Py_Finalize();
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);callEmbeddedPython();return a.exec();
}

异常处理

1.如果qt中引入#include <Python.h>会出现报错

报错
因为用了slots变量,这个在qt中是关键字,需要把这个变量换一个名字就可以了。
在这里插入图片描述

2. 通过嵌入Python调用时候,直接运行脚本是有问题的

需要把这个脚本引入到对应的模块中,才能调用,否则就会报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐

一、什么是工程数字建造管理系统平台&#xff1f; 工程数字建造管理系统平台是一种集成了先进信息技术&#xff08;如云计算、大数据、物联网等&#xff09;的综合性管理工具&#xff0c;它旨在通过数字化手段提升工程建造全过程的管理效率和决策水平。这一平台不仅覆盖了工程…

Android开发EmojiCompat 初始化

Android开发EmojiCompat 初始化 报错信息&#xff1a; ensure spannable:java.lang.IllegalStateException: EmojiCompat is not initialized 在Application上写上下面代码即可&#xff1a; EmojiCompat.Config config new BundledEmojiCompatConfig(this);EmojiCompat.in…

【Go】数组

数组Array 重点&#xff1a; 数组是值类型 注意点: 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案

计算机该如何求解三角函数&#xff1f;或许你的第一印象是采用泰勒展开&#xff0c;或者采用多项式进行逼近。对于前者&#xff0c;来回的迭代计算开销成本很大&#xff1b;对于后者&#xff0c;多项式式逼近在较窄的范围內比较接近&#xff0c;超过一定范围后&#xff0c;就变…

【剪辑_BGM 整合】

【优质BGM➽以剪映为基础】 自定义 一、舒缓惬意 二、轻快 1&#xff0c;快乐骑行 2&#xff0c;医疗科普 3&#xff0c;宣传片励志摇滚热血 Going back to Business 4&#xff0c;电子宠物&#xff08;memories&#xff09; 5&#xff0c;诗与远方&#xff08;热播&…

linux 常见命令使用介绍

Linux 常见命令使用介绍 Linux 是一个功能强大的操作系统&#xff0c;其核心是命令行工具。掌握一些常用的 Linux 命令可以极大地提高工作效率。本文将详细介绍一些常见的 Linux 命令及其用法。 1. 文件与目录操作 ls - 列出文件和目录 # 查看当前目录下的所有文件和子目录&…

Rust从入门到精通之精通篇:24.高级异步编程

高级异步编程 在 Rust 精通篇中&#xff0c;我们将深入探索 Rust 的高级异步编程技术。Rust 的异步编程模型基于 Future 特征和异步运行时&#xff0c;提供了高效的非阻塞 I/O 和并发处理能力。在本章中&#xff0c;我们将超越基础知识&#xff0c;探索如何构建高性能异步系统…

(C语言)学生信息表(基于通讯录改版)(测试版)(C语言项目)

1.首先是头文件&#xff1a; //student.h //头文件//防止头文件被重复包含#pragma once//宏定义符号常量&#xff0c;方便维护和修改 #define ID_MAX 20 #define NAME_MAX 20 #define AGE_MAX 5 #define SEX_MAX 5 #define CLA_MAX 20 //定义初始最大容量 #define MAX 1//定义结…

Problem D: 抽象类

1.题目问题 2.输入 3.输出 4.代码实现 补充&#xff1a; 没错&#xff0c;你没看错&#xff0c;没有 abstract class Vehicle &#xff0c;才能过。 恶心人 答案&#xff1a; {abstract void NoOfWheels(); }class Car extends Vehicle {Overridepublic void NoOfWheels()…

UniApp开发多端应用——流式语音交互场景优化

一、问题背景&#xff1a;UniApp默认方案的局限性 在流式语音交互场景&#xff08;如AI语音助手、实时字幕生成&#xff09;中&#xff0c;UniApp默认的uni.getRecorderManager 和uni.createInnerAudioContext 存在以下瓶颈&#xff1a; 录音端&#xff1a; 延迟高&#xff1…

docker构建并启动前端

docker文件示例代码&#xff1a; # Use a minimal image for development FROM node:18-alpine# Set working directory inside the container WORKDIR /app# Copy package.json and package-lock.json (or yarn.lock) into the container COPY package.json package-lock.jso…

25大唐杯赛道一本科B组大纲总结(上)

25大唐杯省赛马上要开始&#xff0c;还没开始准备的要抓紧了 可看我之前发的备赛攻略&#xff0c;理论的准备要先将大纲整理成思维导图框架 然后根据重点&#xff0c;在资料中寻找&#xff0c;记忆 这里帮大家整理好了&#xff0c;后续其他组别会相继更新 基于竞赛大纲做的思…

【Python3教程】Python3基础篇之Lambda(匿名函数)

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

重试机制之指针退避策略算法

一、目的&#xff1a;随着重试次数增加&#xff0c;逐步延长重连等待时间&#xff0c;避免加重服务器负担。 二、计算公式&#xff1a; 每次重试的延迟时间 初始间隔 (退避基数 ^ 重试次数) 通常设置上限防止等待时间过长。 const delay Math.min(initialDelay * Math.pow…

SSE SseEmitter.completeWithError(e) 触发的处理逻辑

在 Java 客户端使用 OkHttp 监听 SSE&#xff08;Server-Sent Events&#xff09; 的情况下&#xff0c;当服务端调用 SseEmitter.completeWithError(e)&#xff0c;客户端会触发 EventSourceListener 的 onFailure() 方法&#xff08;而不是 onError&#xff09;。 1. 服务端&…

4月手机新品前瞻,影像,性能与设计卷得起飞

在智能手机市场中,4月向来是新品频发的黄金时段。各大手机厂商纷纷摩拳擦掌,准备推出自家的重磅机型,在影像、性能与设计等核心领域展开激烈角逐,一场没有硝烟的“科技大战”即将拉开帷幕。接下来,让我们一同深入了解那些备受瞩目的新品,提前感受科技进步带来的魅力。 一…

设计审查效率革命|CAD原生数据直通自动公差验证

“为何 90% 的 GD&T 问题在设计评审时未被发现&#xff1f;怎样避免因 GD&T 考虑不周导致的批量返工&#xff1f;” 这正是 CETOL 自动辅助审查设计系统要解决的核心问题&#xff1a;通过200结构化审查规则拦截潜在设计疏漏。 功能一&#xff1a;装配约束健康诊断&…

k8s scheduler几种扩展方式的关系及区别

网上关于scheduler扩展介绍的文章很多&#xff0c;但都是东说一句西说一嘴&#xff0c;完全没有逻辑性&#xff0c;对于逻辑建构者看着很痛苦&#xff0c;这篇文章不会深入教你怎么扩展&#xff0c;而是教你几种扩展方式的关系和逻辑结构&#xff1a; 目前Kubernetes支持五种方…

近场探头的选型

近场探头包括磁场探头和电场探头。 下图中画圈的是电场探头&#xff1a; 左侧3只是磁场探头&#xff0c;最右侧一只是电场探头。不同孔径的磁场探头的有效测量距离和分辨率不同 电场探头和磁场探头分别在什么情况下使用&#xff1a; 一般近场测试&#xff0c;使用的都是磁场探…

Pycharm运行时报“Empty suite”,可能是忽略了这个问题

问题&#xff1a;使用Pycharm运行testcases目录下的.py文件&#xff0c;报“Empty suite”&#xff0c;没有找到测试项。 排查过python解释器、pytest框架安装等等&#xff0c;依然报这个错&#xff0c;依然没找到&#xff0c;最后终端运行&#xff1a; pytest test_demo.py&a…