簡介
python 豐富的子產品檔案使得python在完成一些功能時非常的友善,在工程中調用python腳本使得效率大大提升。
一、環境配置
python環境配置
要想在vs中調用python腳本,先要将python的解釋環境配置到vs工程中。在vs中建立qt工程。然後将python解釋器環境拷貝到工程目錄下。

得到python解釋器環境的方式有很多:
- 複制安裝好的整個python環境
- 使用pycharm等三方工具建立虛拟環境
-
從安裝好的python環境中提取所需要的環境
本文采用第三中方式
VS+QT調用python腳本 複制圖中三個檔案夾到一個新的檔案夾中,在拷貝到工程目錄下。
工程環境配置
屬性 -> c/c++ ->正常 -> 附加包含目錄 添加python環境的include檔案夾
屬性 ->連結器 ->正常 -> 附加庫目錄 添加python環境的libs檔案夾VS+QT調用python腳本 屬性 ->連結器 ->輸入-> 附加依賴項 添加python36.libVS+QT調用python腳本 然後再工程中包含python.h文頭件,編譯VS+QT調用python腳本
避坑
1.編譯時報錯“錯誤 LNK1104 無法打開檔案“python36_d.lib”,将libs中的python36.lib複制一份,重命名為python36_d.lib
2.編譯報錯error: expected unqualified-id before ‘;’ token,這是與qt的slots關鍵字沖突,解決辦法是将python中的slot取消宏定義,然後再恢複,如下圖
二、調用python腳本
python腳本
def add(a, b):
c=a+b
return c
c++代碼
Py_Initialize();
if (!Py_IsInitialized())
{
printf("error!");
PyErr_Print(); //列印錯誤
return ;
}
//先獲得py檔案所在的路徑,必須要絕對路徑
QString path = QDir::currentPath();
path = path.replace("\\", "/");
qDebug() << path << endl;
path ="sys.path.append('"+ path+"/pycode"+"')";
QByteArray temp = path.toLocal8Bit();
//再設定python運作路徑
PyRun_SimpleString("import sys");
PyRun_SimpleString(temp.data());
/**************************/
//如果在py中import了其他子產品,應該其他子產品也設定到運作路徑中
//PyRun_SimpleString("sys.path.append('C:/Users/Administration/Desktop/123/python/Lib/site-packages')");
/**************************/
//導入hello.py子產品
PyObject* pModule = PyImport_ImportModule("hello");
if (!pModule) {
printf("Cant open python file!\n");
return;
}
//調用hello腳本
//PyObject_CallFunction(pModule, NULL);
//通過子產品獲得add函數
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
if (pFunc)
{
//建立參數清單
PyObject* args = PyTuple_New(2);
PyObject* arg1 = PyLong_FromLong(11111);
PyObject* arg2 = PyLong_FromLong(22222);
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
PyObject *result = PyObject_CallObject(pFunc,args);
if (result)
{
long a = PyLong_AsLong(result);
qDebug() << "a:" << a << endl;
}
}
//結束,釋放python
Py_Finalize();
運作結果
完整代碼下載下傳