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調用時候,直接運行腳本是有問題的
需要把這個腳本引入到對應的模塊中,才能調用,否則就會報錯。