c++調用python3

參考: https://blog.csdn.net/love_clc/article/details/76653100

調用python2的參考:https://mp.csdn.net/console/editor/html/105813794

c++訪問python3-實例化類的方法

下面列出C++訪問python所需的函數,按調用的先後次序排列。
提示: 其中實例化類的方法是python3中的,若要使用python2,則用PyInstance_New這個方法。有關此方法網上有很多資料,就不列出了。

 

#include "pch.h"
#include<Python.h>
#include <string>
#include <iostream>
using namespace std;

#pragma comment(lib,"python3.lib")
#pragma comment(lib,"python37.lib")
	
Py_Initialize(); /*初始化python解釋器,告訴編譯器要用的python編譯器*/
	PyRun_SimpleString("import sys");
	//PyRun_SimpleString("sys.path.append('./')");

	PyObject* pyMod = PyImport_ImportModule("test"); //  加載test.py文件

	cout << 1 << endl;
	PyObject* pyDict = PyModule_GetDict(pyMod); //  獲取test模塊中的字典
	cout << 2 << endl;
	PyObject* pyCls = PyDict_GetItemString(pyDict, "class_a"); // 從字典中查找tester類
	PyObject* pyIns = PyInstanceMethod_New(pyCls); // 創建tester類
	PyObject* pyRet = PyObject_CallMethod(pyIns, "add", "ii", 5, 6); // 調用tester.add方法,傳入2個int型參數
	int res_value = -1;
	int retok = PyArg_Parse(pyRet, "i", &res_value); // 從返回值從取出int型返回值

	cout << retok << res_value<<endl ;

	Py_Finalize(); /*結束python解釋器,釋放資源*/

//PyInitialize: 必須首先調用,初始化python運行所需模塊。它無參數、無返回值
void Py_Initialize();

/*Py_IsInitialized: 檢查初始化是否成功
*返回值: 成功返回true*/
bool Py_IsInitialized();

/*PyImport_ImportModule: 加載python模塊
*szModuleName: 模塊名稱
*返回值: 成功加載返回模塊指針*/
PyObject *PyImport_ImportModule(const char *szModuleName);

/*PyModule_GetDict: 獲取模塊字典
*pModule: 模塊指針
*返回值: 成功從指定模塊獲取字典返回字典指針*/
PyObject *PyModule_GetDict(PyObject *pModule);

/*PyDict_GetItemString: 從模塊字典中獲取指定的對象
*pDict: 被查找的模塊字典指針
*key: 要查找的模塊中的函數或類名
*返回值: 若找到指定的對象,返回指向它的指針;否則返回NULL*/
PyObject *PyDict_GetItemString(PyObject *pDict, const char *key);

/*PyInstanceMethod_New: 實例化從模塊字典中查找到的類
*pClass: 從模塊字典中找到的類信息指針
*返回值: 根據類信息指針構造該類的實例,並返回它的指針*/
PyObject *PyInstanceMethod_New(PyObject *pClass);

/*PyObject_CallMethod: 調用類方法
*pInstance: 由PyInstanceMethod_New返回的類實例
*pMethodName: 被調用的類方法名
*pFormat: 傳遞給類方法的參數類型格式字符串
*...: 傳給類方法的參數
*返回值: 被調用類方法的返回值。若被調用方法無返回值,則本方法返回NULL*/
PyObject *PyObject_CallMethod(PyObject *pInstance, const char *pMethodName, const char *pFormat, ...);

/*PyObject_CallFunction: 調用模塊中的函數
*pFunction: 從模塊字典中獲取的模塊函數指針
*pFormat: 要傳給模塊函數的參數類型格式化字符串
*...: 傳給模塊函數的參數列表
*返回值: 模塊函數的返回值;若模塊函數無返回值,該方法返回NULL*/
PyObject *PyObject_CallFunction(PyObject *pFunction, const char *pFormat, ...);

/*PyArg_Parse: 從python返回的數據對象中獲取指定的數據
*pArgs: 調用python方法得到的返回值
*pFormat: 指定獲取什麼類型數據的格式化字符串
*...: 存儲獲取數據的指針*/
PyArg_Parse(PyObject *pArgs, const char *pFormat, ...);

//下面這個宏釋放python api創建的對象,如模塊,模塊字典,函數,類和類實例等等
Py_DECREF(pObject);

//最後調用此方法釋放python模塊
Py_Finalize();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章