天天看點

VS+QT調用python腳本

簡介

python 豐富的子產品檔案使得python在完成一些功能時非常的友善,在工程中調用python腳本使得效率大大提升。

一、環境配置

python環境配置

要想在vs中調用python腳本,先要将python的解釋環境配置到vs工程中。在vs中建立qt工程。然後将python解釋器環境拷貝到工程目錄下。

VS+QT調用python腳本

得到python解釋器環境的方式有很多:

  • 複制安裝好的整個python環境
  • 使用pycharm等三方工具建立虛拟環境
  • 從安裝好的python環境中提取所需要的環境

    本文采用第三中方式

    VS+QT調用python腳本

    複制圖中三個檔案夾到一個新的檔案夾中,在拷貝到工程目錄下。

    工程環境配置

    屬性 -> c/c++ ->正常 -> 附加包含目錄 添加python環境的include檔案夾

    VS+QT調用python腳本
    屬性 ->連結器 ->正常 -> 附加庫目錄 添加python環境的libs檔案夾
    VS+QT調用python腳本
    屬性 ->連結器 ->輸入-> 附加依賴項 添加python36.lib
    VS+QT調用python腳本
    然後再工程中包含python.h文頭件,編譯

避坑

1.編譯時報錯“錯誤 LNK1104 無法打開檔案“python36_d.lib”,将libs中的python36.lib複制一份,重命名為python36_d.lib

2.編譯報錯error: expected unqualified-id before ‘;’ token,這是與qt的slots關鍵字沖突,解決辦法是将python中的slot取消宏定義,然後再恢複,如下圖

VS+QT調用python腳本

二、調用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();
           

運作結果

VS+QT調用python腳本

完整代碼下載下傳

Qt

繼續閱讀