C++调用Python

本篇博客就详细讲解一下在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步骤

  1. 修改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
                        )
    
  2. 在C++文件中include Python.h文件
    #include"Python.h"

  3. 初始化Python编译器

      cout<<"进行Python初始化"<<endl;
      Py_Initialize();
      if(!Py_IsInitialized()){
        cout<<"Python初始化失败!"<<endl;
        return ;
      }
      cout<<"Python初始化成功!"<<endl;
    
  4. 添加.py文件的文件夹路径

    	//添加.py文件的文件夹路径
    	PyRun_SimpleString("import sys");  
    	PyRun_SimpleString("sys.path.append('../')"); 
    

    我这里添加的路径为../是因为我在build文件夹下运行demo,这样我的my_demo.py文件就在外层。所以要使用../来表示python文件夹位置。

  5. 创建python模块(pMoudle)

      PyObject* pMoudle = NULL;
      pMoudle = PyImport_ImportModule("my_demo");
      if(pMoudle==NULL){
        cout<<"PyImport_ImportMoudle失败!"<<endl;
        return ;
      }
      cout<<"PyImport_ImportMoudle成功!"<<endl;
    
  6. 获取类,并创建类对象

      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;
      }
    
  7. 调用成员函数

      PyObject_CallMethod(pPerson,"talk",nullptr);
    
  8. 调用普通函数

      //调用函数
      PyObject* pFunc=NULL;
      pFunc = PyObject_GetAttrString(pMoudle,"helloworld");
      PyEval_CallObject(pFunc,NULL);
    
  9. **最后,用和Py_Initialize()对应的函数来结束Python编译

      Py_Finalize();
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值