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.pswp.cn/pingmian/73747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73747.shtml
英文地址,請注明出處:http://en.pswp.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…