c++调用python的代码、函数、类
一、配置python環(huán)境問(wèn)題
1.首先安裝Python(版本無(wú)所謂),安裝的時(shí)候選的添加python路徑到環(huán)境變量中
安裝之后的文件夾如下所示:
2.在VS中配置環(huán)境和庫(kù)
右擊項(xiàng)目->屬性->VC++目錄
1)包含目錄:
Python安裝路徑/include
2)庫(kù)目錄:
Python安裝路徑/libs
右擊項(xiàng)目->屬性->連接器->輸入->附加依賴庫(kù)
debug下:
python安裝目錄/libs/python37.lib
release下:
python安裝目錄/libs/python37_d.lib
注意
1、debug配置的時(shí)候可能沒(méi)有python37_d.lib,那就把python37.lib復(fù)制一個(gè),然后重命名為python36_d.lib就可以啦
2、如果一直報(bào)錯(cuò),但是包含頭文件等都沒(méi)有問(wèn)題,那么你需要看一下你的python是32位還是64位的。然后根據(jù)python的環(huán)境去配置vs的環(huán)境。
即圖中,注意根據(jù)python環(huán)境選擇64還是32位。
二、c++中運(yùn)行python代碼
#include<python.h> #include<iostream>int main() {Py_Initialize();//使用python之前,要調(diào)用Py_Initialize();這個(gè)函數(shù)進(jìn)行初始化PyRun_SimpleString("print('hello world!')");PyRun_SimpleString("def fun:print('test');")Py_Finalize();return 0; }三、c++調(diào)用python函數(shù)并輸出返回值
3.1、定義python函數(shù)
def add(a,b):return a+b3.2、測(cè)試
#include <Python.h> #include<iostream>using namespace std;int main() {Py_Initialize();//使用python之前,要調(diào)用Py_Initialize();這個(gè)函數(shù)進(jìn)行初始化if (!Py_IsInitialized()){printf("初始化失敗!");return 0;}PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");//這一步很重要,修改Python路徑PyObject * pModule = NULL;//聲明變量PyObject * pFunc = NULL;// 聲明變量pModule = PyImport_ImportModule("pythonTest");//這里是要調(diào)用的文件名hello.pyif (pModule == NULL){cout << "沒(méi)找到" << endl;}pFunc = PyObject_GetAttrString(pModule, "add_num");//這里是要調(diào)用的函數(shù)名PyObject* args = Py_BuildValue("(ii)", 28, 103);//給python函數(shù)參數(shù)賦值PyObject* pRet = PyObject_CallObject(pFunc, args);//調(diào)用函數(shù)int res = 0;PyArg_Parse(pRet, "i", &res);//轉(zhuǎn)換返回類型cout << "res:" << res << endl;//輸出結(jié)果Py_Finalize();//調(diào)用Py_Finalize,這個(gè)根Py_Initialize相對(duì)應(yīng)的。return 0; }注意:請(qǐng)將python文件放在c++項(xiàng)目的根目錄或者改變測(cè)試代碼中的python文件的路徑。
四、調(diào)用python的類
int test03() {Py_Initialize();//使用python之前,要調(diào)用Py_Initialize();這個(gè)函數(shù)進(jìn)行初始化if (!Py_IsInitialized()){printf("初始化失敗!");return 0;}PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");//這一步很重要,修改Python路徑PyObject * pModule = NULL;//聲明變量PyObject * pFunc = NULL;// 聲明變量PyObject * pClass = NULL;//聲明變量PyObject * pInstance = NULL;pModule = PyImport_ImportModule("pythonTest");//這里是要調(diào)用的文件名hello.pyif (pModule == NULL){cout << "沒(méi)找到" << endl;}// 模塊的字典列表PyObject* pDict = PyModule_GetDict(pModule);if (!pDict) {printf("Cant find dictionary./n");return -1;}//獲取calc類PyObject* pClassCalc = PyDict_GetItemString(pDict, "calc");if (!pClassCalc) {printf("Cant find calc class./n");return -1;}//構(gòu)造Person的實(shí)例PyObject* pInstanceCalc = PyInstanceMethod_New(pClassCalc);if (!pInstanceCalc) {printf("Cant find calc instance./n");return -1;}PyObject* pRet = PyObject_CallMethod(pClassCalc,"add","10","10", pInstanceCalc);if (!pRet){printf("不能找到 pRet");return -1;}int res = 0;PyArg_Parse(pRet, "i", &res);//轉(zhuǎn)換返回類型cout << "res:" << res << endl;//輸出結(jié)果//釋放/*Py_DECREF(pClassCalc);Py_DECREF(pInstanceCalc);Py_DECREF(pModule);*/Py_Finalize(); // 與初始化對(duì)應(yīng)system("pause");return 0; }點(diǎn)個(gè)贊,看一看,好習(xí)慣!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收錄,這是我花了 3 個(gè)月總結(jié)的一線大廠 Java 面試總結(jié),本人已拿大廠 offer。
另外,原創(chuàng)文章首發(fā)在我的個(gè)人博客:blog.ouyangsihai.cn,歡迎訪問(wèn)。
最后,再分享我歷時(shí)三個(gè)月總結(jié)的 Java 面試 + Java 后端技術(shù)學(xué)習(xí)指南,這是本人這幾年及春招的總結(jié),已經(jīng)拿到了大廠 offer,整理成了一本電子書(shū),拿去不謝,目錄如下:
現(xiàn)在免費(fèi)分享大家,在下面我的公眾號(hào) 程序員的技術(shù)圈子 回復(fù) 面試 即可獲取。
有收獲?希望老鐵們來(lái)個(gè)三連擊,給更多的人看到這篇文章
1、老鐵們,關(guān)注我的原創(chuàng)微信公眾號(hào)「程序員的技術(shù)圈子」,專注于 Java、數(shù)據(jù)結(jié)構(gòu)和算法、微服務(wù)、中間件等技術(shù)分享,保證你看完有所收獲。
2、給俺點(diǎn)個(gè)贊唄,可以讓更多的人看到這篇文章,順便激勵(lì)下我繼續(xù)寫(xiě)作,嘻嘻。
3、另外,原創(chuàng)文章首發(fā)在我的個(gè)人博客:blog.ouyangsihai.cn,歡迎訪問(wèn)。
點(diǎn)贊是對(duì)我最大的鼓勵(lì)
↓↓↓↓↓↓
總結(jié)
以上是生活随笔為你收集整理的c++调用python的代码、函数、类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 高并发之并发容器,了解多少(从入门到超神
- 下一篇: anaconda+python3.6利用