zoukankan      html  css  js  c++  java
  • Boost Python学习笔记(五)

    你将学到什么

    • 在C++中调用Python代码时的返回值问题

    基础类型

    修改Python脚本(build/zoo.py)

    def rint():
        return 2
    
    def rstr():
        return "fwd"
    
    if __name__ == '__main__':
        pass
    

    修改源文件(main.cpp)

    #include <iostream>
    #include <boost/python.hpp>
    
    using namespace boost::python;
    using namespace boost::python::detail;
    
    int main()
    {
      Py_Initialize();
      if (!Py_IsInitialized())
      {
        std::cout << "Initialize failed" << std::endl;
        return -1;
      }
    
      try
      {
        object sys_module = import("sys");
        str module_directory(".");
        sys_module.attr("path").attr("insert")(1, module_directory);
        object module = import("zoo");
        object x = module.attr("rint")();
        int rx = extract<int>(x);
        std::cout << "rint: " << rx << std::endl;
        object y = module.attr("rstr")();
        std::string rs = extract<std::string>(y);
        std::cout << "rstr: " << rs << std::endl;
      }
      catch (const error_already_set&)
      {
        PyErr_Print();
      }
      Py_Finalize();
      return 0;
    }
    

    标准库

    修改Python脚本(build/zoo.py)

    def rvec():
        return [1, 2, 3, "fwd"]
    
    if __name__ == '__main__':
        pass
    

    修改源文件(main.cpp)

    #include <iostream>
    #include <vector>
    #include <string>
    #include <boost/python.hpp>
    
    using namespace boost::python;
    using namespace boost::python::detail;
    
    int main()
    {
      Py_Initialize();
      if (!Py_IsInitialized())
      {
        std::cout << "Initialize failed" << std::endl;
        return -1;
      }
    
      try
      {
        object sys_module = import("sys");
        str module_directory(".");
        sys_module.attr("path").attr("insert")(1, module_directory);
        object module = import("zoo");
        object v = module.attr("rvec")();
        boost::python::handle<> v_iter(PyObject_GetIter(v.ptr()));
        std::cout << "rvec: ";
        while (true)
        {
          handle<> py_hdl(allow_null(PyIter_Next(v_iter.get())));
          if (PyErr_Occurred())
            throw_error_already_set();
          if (!py_hdl.get())
            break;
          object py_obj(py_hdl);
          object r = py_obj.attr("__str__")();
          std::string rs = extract<std::string>(r);
          std::cout << rs << " ";
        }
        std::cout << std::endl;
      }
      catch (const error_already_set&)
      {
        PyErr_Print();
      }
      Py_Finalize();
      return 0;
    }
    
  • 相关阅读:
    Could not get lock /var/lib/apt/lists/lock
    使用vmware提示无法打开内核设备 \.Globalvmx86: 系统找不到指定的文件
    Linux 下安装 MATLAB
    超级干货:Linux常用命令 & 实用命令万字总结!
    GNB 配置图图解
    GNB Linux 部署说明
    解决Firefox启动、打开网页慢、占用内存多
    【Git教程】如何清除git仓库的所有提交记录,成为一个新的干净仓库
    mount --bind和硬连接的区别
    彻底删除 Windows Defender
  • 原文地址:https://www.cnblogs.com/silvermagic/p/9087514.html
Copyright © 2011-2022 走看看