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