C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解
c++調(diào)用Python首先安裝Python,以win7為例,Python路徑為:c:\Python35\,通過(guò)mingw編譯c++代碼。
編寫makefile文件,首先要添加包含路徑:
inc_path += c:/Python35/include
然后添加鏈接參數(shù):
ld_flag += c:/Python35/libs/libpython35.a
在源文件中添加頭文件引用:
#include "Python.h"
Python解釋器需要進(jìn)行初始化,完成任務(wù)后需要終止:
void start() { int r=Py_IsInitialized(); //1為已經(jīng)初始化了 if (r==0) { //Py_SetPythonHome(L"C:\\Python35"); Py_Initialize(); //初始化 p_main_Module =PyImport_ImportModule("__main__"); if (!p_main_Module) { throw ""; } } } void end() { Py_Finalize(); //清理 }
程序部署時(shí)可以將c:\Python35\lib目錄復(fù)制到執(zhí)行程序路徑下,或者通過(guò)Py_SetPythonHome(L"C:\\Python35");設(shè)置Python的安裝目錄。
C++調(diào)用Python的基本需求:
1、運(yùn)行Python指令
PyRun_SimpleString("print(os.getcwd(),a)"); pyext.eval(R"(a+='qwer')");
2、加載Python模塊
PyObject * pModule =PyImport_ImportModule("tp"); //test:Python文件名,若腳本有錯(cuò)則返回空 PyRun_SimpleString("import os");
3、給Python的變量賦值
對(duì)于數(shù)值,使用Py_BuildValue:
Py_BuildValue("") None Py_BuildValue("i", 123) 123 Py_BuildValue("iii", 123, 456, 789) (123, 456, 789) Py_BuildValue("s", "hello") 'hello' Py_BuildValue("ss", "hello", "world") ('hello', 'world') Py_BuildValue("s#", "hello", 4) 'hell' Py_BuildValue("()") () Py_BuildValue("(i)", 123) (123,) Py_BuildValue("(ii)", 123, 456) (123, 456) Py_BuildValue("(i,i)", 123, 456) (123, 456) Py_BuildValue("[i,i]", 123, 456) [123, 456] Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}
對(duì)于其他數(shù)據(jù)結(jié)構(gòu),使用相應(yīng)的函數(shù)設(shè)置,例如:
PyObject *pArgs = PyTuple_New(1); PyObject *pDict = PyDict_New(); //創(chuàng)建字典類型變量 PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典類型變量中填充數(shù)據(jù) PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典類型變量中填充數(shù)據(jù) PyTuple_SetItem(pArgs, 0, pDict);//0---序號(hào) 將字典類型變量添加到參數(shù)元組中
構(gòu)造好對(duì)象以后,通過(guò)PyObject_SetAttrString來(lái)設(shè)置進(jìn)入Python中:
PyObject *ps=PyUnicode_DecodeUTF8(val,strlen(val),"ignore"); //構(gòu)造了一個(gè)對(duì)象 PyObject_SetAttrString(p_main_Module,key,ps); //設(shè)置
4、獲取Python變量的值
首先取得變量的指針,然后通過(guò)PyArg_Parse解析
pModule =PyImport_ImportModule("__main__"); pReturn = PyObject_GetAttrString(pModule, "a"); //可以獲得全局變量 int size = PyDict_Size(pReturn); PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age"); int newAge; PyArg_Parse(pNewAge, "i", &newAge);
對(duì)于元組的解析:
int ok; ok = PyArg_ParseTuple(args, "s", &s); //Python call: f('whoops!') ok = PyArg_ParseTuple(args, "lls", &k, &l, &s);//Python call: f(1, 2,'three') ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);//Python call: f((1, 2), 'three') ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);//Python calls: //f('spam') //f('spam', 'w') //f('spam', 'wb', 100000)
5、調(diào)用Python函數(shù)
PyObject * pfun=PyObject_GetAttrString(pModule, "testdict"); //testdict:Python文件中的函數(shù)名 PyObject *pReturn = PyEval_CallObject(pfun, pArgs); //調(diào)用函數(shù)
6、設(shè)置函數(shù)讓Python調(diào)用
首先定義c函數(shù),然后聲明方法列表,然后聲明模塊,然后增加這個(gè)模塊,最后調(diào)用
static int numargs=1890; static PyObject* emb_numargs(PyObject *self, PyObject *args) //C函數(shù) { if(!PyArg_ParseTuple(args, ":numargs")) return NULL; return PyLong_FromLong(numargs); } static PyMethodDef EmbMethods[] = { //方法列表 {"numargs", emb_numargs, METH_VARARGS, "Return the number of arguments received by the process."}, {NULL, NULL, 0, NULL} }; static PyModuleDef EmbModule = { //模塊聲明 PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods, NULL, NULL, NULL, NULL }; static PyObject* PyInit_emb(void) //模塊初始化函數(shù) { return PyModule_Create(&EmbModule); } //增加模塊: PyImport_AppendInittab("emb", &PyInit_emb); //增加一個(gè)模塊
Python部分代碼:
import emb print("Number of arguments", emb.numargs())
以上所述是小編給大家介紹的C++調(diào)用Python基礎(chǔ)功能實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C語(yǔ)言練習(xí)之?dāng)?shù)組中素?cái)?shù)交換
這篇文章主要為大家介紹了C語(yǔ)言數(shù)組中素?cái)?shù)交換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>2021-12-12C語(yǔ)言學(xué)習(xí)之標(biāo)識(shí)符的使用詳解
C語(yǔ)言標(biāo)識(shí)符是用于表示變量、函數(shù)、常量、類型等程序元素的名稱,這篇文章將通過(guò)一些簡(jiǎn)單的示例為大家介紹一下C語(yǔ)言標(biāo)識(shí)符的使用,需要的可以參考一下2023-05-05Qt項(xiàng)目實(shí)戰(zhàn)之實(shí)現(xiàn)MP3音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)MP3音樂(lè)播放器,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解一下2023-03-03C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Qt中QMapIterator檢測(cè)是否為空的實(shí)現(xiàn)
本文主要介紹了Qt中QMapIterator檢測(cè)是否為空的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10C語(yǔ)言中g(shù)etchar的用法以及實(shí)例解析
getchar()是stdio.h中的庫(kù)函數(shù),它的作用是從stdin流中讀入一個(gè)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar的用法以及實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03