• 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;
    }
    
  • 相关阅读:
    我的死党前同事 料
    相信缘份吗?我所见所闻的测试工程师
    多线程基础【面试题形式】
    kafka学习(五)Spring Boot 整合 Kafka
    kafka学习(四)kafka安装与命令行调用
    J2EE的13个规范总结
    Spring Boot学习(四)常用注解
    kafka学习(三)kafka生产者,消费者详解
    dubbo学习(十一)dubbo知识点总结
    MyBatis学习(三)日志输出环境配置
  • 原文地址:https://www.cnblogs.com/silvermagic/p/9087514.html
Copyright © 2020-2023  润新知