本篇博客就详细讲解一下在C++下调用Python。 使用的环境在Ubuntu16.04下。
首先要创建一个 .py 文件,这里就将他命名为my_demo.py,其中有Person类,一个类构造函数和一个talk()函数
class Person:
def __init__(self):
print "create a person"
def talk(self):
print "a person is talking"
def add(a,b):
return a+b
def helloworld():
print "helloworld!"
调用Python步骤
-
修改CMakeList.txt文件
#找到Python的位置 find_package(PythonLibs REQUIRED) if (NOT PythonLibs_FOUND) message(FATAL_ERROR "PYTHON LIBS not found.") else() message("PYTHON LIBS were found!") message("PYTHON LIBS DIRECTORY: " ${PYTHON_LIBRARY}) endif() #将Python的.so文件链接到项目 target_link_libraries(demo ${OpenCV_LIBS} /usr/lib/x86_64-linux-gnu/libpython2.7.so )
-
在C++文件中include Python.h文件
#include"Python.h"
-
初始化Python编译器
cout<<"进行Python初始化"<<endl; Py_Initialize(); if(!Py_IsInitialized()){ cout<<"Python初始化失败!"<<endl; return ; } cout<<"Python初始化成功!"<<endl;
-
添加.py文件的文件夹路径
//添加.py文件的文件夹路径 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('../')");
我这里添加的路径为
../
是因为我在build文件夹下运行demo,这样我的my_demo.py文件就在外层。所以要使用../
来表示python文件夹位置。 -
创建python模块(pMoudle)
PyObject* pMoudle = NULL; pMoudle = PyImport_ImportModule("my_demo"); if(pMoudle==NULL){ cout<<"PyImport_ImportMoudle失败!"<<endl; return ; } cout<<"PyImport_ImportMoudle成功!"<<endl;
-
获取类,并创建类对象
PyObject* pClass=NULL; pClass = PyObject_GetAttrString(pMoudle,"Person"); if(pClass == NULL){ cout<<"获取类失败"<<endl; } cout<<"获取类成功!"<<endl; //初始化类对象 PyObject* pPerson=NULL; pPerson = PyInstance_New(pClass,NULL,NULL); if(pPerson==NULL){ cout<<"类对象初始化失败!"<<endl; }
-
调用成员函数
PyObject_CallMethod(pPerson,"talk",nullptr);
-
调用普通函数
//调用函数 PyObject* pFunc=NULL; pFunc = PyObject_GetAttrString(pMoudle,"helloworld"); PyEval_CallObject(pFunc,NULL);
-
**最后,用和Py_Initialize()对应的函数来结束Python编译
Py_Finalize();