C++呼叫Python例項
阿新 • • 發佈:2019-01-10
C++呼叫Python方法基本有以下幾個步驟:
1、下載Python;
2、配置資訊(本次我用的配置是VS2013+Python36),注意Python請下載32位的版本(即使你的作業系統是64位的),否則會函式未定義的錯誤
3、把Python加到VS2013的方法;先建立一個空的Win32控制檯專案,建立main.cpp(具體程式碼下面由貼出),把python3.6的減壓後,將裡面的inlcude和libs兩個資料夾拷貝到。sln的同一級目錄下,然後開啟libs,複製一份python36.lib,並命名為python36_d.lib(這個的原因是inlcude目錄下的pyconfig.h裡面的程式碼在debug下呼叫的是python36_d.lib), 然後右擊進入屬性設定頁 C++->常規->附加包含目錄,輸入 ..\include;
再找到連結器->常規->附加目錄項,輸入 ..\libs; 接著找到連結器->輸入->附加依賴項,新增python36_d.lib;到這裡,配置資訊就OK了;
4、接下來把python3.6的減壓檔案下的python36.dll拷貝到Debug目錄下(與Test.exe同目錄),並在該Debug目錄下新建一個txt檔案,改名為Test001.py(裡面的內容下面將會貼出)
5、接下來就是程式碼部分:
main.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "Python.h"
}
//呼叫輸出"Hello Python"函式
void Hello()
{
Py_Initialize();//呼叫Py_Initialize()進行初始化
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//呼叫的Python檔名
pFunc = PyObject_GetAttrString(pModule, "Hello");//呼叫的函式名
PyEval_CallObject(pFunc, NULL);//呼叫函式,NULL表示引數為空
Py_Finalize();//呼叫Py_Finalize,和Py_Initialize相對應的.
}
//呼叫Add函式,傳兩個int型引數
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//Test001:Python檔名
pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python檔案中的函式名
//建立引數:
PyObject *pArgs = PyTuple_New(2);//函式呼叫的引數傳遞均是以元組的形式打包的,2表示引數個數
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序號,i表示建立int型變數
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序號
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs);//呼叫函式
//將返回值轉換為int型別
int result;
PyArg_Parse(pReturn, "i", &result);//i表示轉換成int型變數
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
int main(int argc, char** argv)
{
cout << "呼叫Test001.py中的Hello函式..." << endl;
Hello();
cout << "\n呼叫Test001.py中的Add函式..." << endl;
Add();
getchar();
return 0;
} 6、Test001.py檔案中內容 def Hello():
print("Hello Python")
def Add(a, b):
return a+b
7、這樣簡單的C++呼叫Python的實現就完成了。
using namespace std;
extern "C"
{
#include "Python.h"
}
//呼叫輸出"Hello Python"函式
void Hello()
{
Py_Initialize();//呼叫Py_Initialize()進行初始化
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//呼叫的Python檔名
pFunc = PyObject_GetAttrString(pModule, "Hello");//呼叫的函式名
PyEval_CallObject(pFunc, NULL);//呼叫函式,NULL表示引數為空
Py_Finalize();//呼叫Py_Finalize,和Py_Initialize相對應的.
}
//呼叫Add函式,傳兩個int型引數
void Add()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("Test001");//Test001:Python檔名
pFunc = PyObject_GetAttrString(pModule, "Add");//Add:Python檔案中的函式名
//建立引數:
PyObject *pArgs = PyTuple_New(2);//函式呼叫的引數傳遞均是以元組的形式打包的,2表示引數個數
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序號,i表示建立int型變數
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序號
//返回值
PyObject *pReturn = NULL;
pReturn = PyEval_CallObject(pFunc, pArgs);//呼叫函式
//將返回值轉換為int型別
int result;
PyArg_Parse(pReturn, "i", &result);//i表示轉換成int型變數
cout << "6 + 8 = " << result << endl;
Py_Finalize();
}
int main(int argc, char** argv)
{
cout << "呼叫Test001.py中的Hello函式..." << endl;
Hello();
cout << "\n呼叫Test001.py中的Add函式..." << endl;
Add();
getchar();
return 0;
} 6、Test001.py檔案中內容 def Hello():
print("Hello Python")
def Add(a, b):
return a+b
7、這樣簡單的C++呼叫Python的實現就完成了。