boost.python库应用之嵌入python

本文演示了如何在C++程序中嵌入Python环境,导入模块、执行Python代码并获取结果,包括获取当前工作目录、判断文件存在性、操作列表和使用Python内置函数等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


[cpp]  view plain copy
  1. // testPython.cpp : 定义控制台应用程序的入口点。  
  2.   
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. #include <Python.h>  
  7. #include <boost/python.hpp>  
  8. using namespace boost::python;//使用boost::python命名空间  
  9.   
  10. int _tmain(int argc, _TCHAR* argv[])  
  11. {  
  12.     Py_Initialize ();//初始化python环境  
  13.     if(!Py_IsInitialized())  
  14.     {  
  15.         cout<<"------python初始化失败"<<endl;  
  16.         return 0;  
  17.     }  
  18.   
  19.     object mainModule;//main模块  
  20.     object mainNamespace;//main命名空间  
  21.     try  
  22.     {  
  23.         mainModule = import("__main__");//导入__main__模块  
  24.         mainNamespace = mainModule.attr("__dict__");  
  25.   
  26.         //直接执行  
  27.         exec("import os", mainNamespace, mainNamespace);  
  28.         exec("print os.getcwd()", mainNamespace, mainNamespace);  
  29.   
  30.         //间接执行  
  31.         object mod = mainModule.attr("os");  
  32.         object foo = mod.attr("getcwd");  
  33.         string dir = extract<string>(foo());  
  34.         cout<<"cur dir:"<<dir<<endl;  
  35.   
  36.         mod = mod.attr("path");  
  37.         foo = mod.attr("isfile");  
  38.         bool r = extract<bool>(foo("testPython.cpp"));  
  39.         cout<<"file exsit:"<<r<<endl;  
  40.     }  
  41.     catch(...)  
  42.     {  
  43.         if (PyErr_Occurred())  
  44.             PyErr_Print();  
  45.     }  
  46.   
  47.     //Py_Finalize (); //不要调用Py_Finalize,因为boost库目前还不完善,有全局变量还未释放。  
  48.     system("pause");  
  49.     return 0;  
  50. }  

简要说明下:

import:导入模块。

object :相当于PyObject,是对PyObject类型的封装。可以理解为万能的Python类型。

object::attr(char const*):获得模块的属性。

foo():相当于函数调用,返回值是一个object类型。

extract:将object类型转换成相应的C++类型。


    嵌入python,基本上就这些东西了。

   下面是个更全面点的例子:

[cpp]  view plain copy
  1. // testPython.cpp : 定义控制台应用程序的入口点。  
  2.   
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. #include <Python.h>  
  7. #include <boost/python.hpp>  
  8. using namespace boost::python;  
  9.   
  10. int _tmain(int argc, _TCHAR* argv[])  
  11. {  
  12.     Py_Initialize ();  
  13.     if(!Py_IsInitialized())  
  14.     {  
  15.         cout<<"------python初始化失败"<<endl;  
  16.         return 0;  
  17.     }  
  18.   
  19.     try  
  20.     {  
  21.         object mainModule = import("__main__"); //main模块  
  22.         object mainNamespace = mainModule.attr("__dict__");//main命名空间  
  23.   
  24.         //e1.直接执行方法。获取当前路径。  
  25.   
  26.         //在匿名空间中运行,即结果会保留在mainNamespace中,  
  27.         //可以以mainNamespace["xx"]的方式取得结果。  
  28.         exec("import os", mainNamespace, mainNamespace); //导入os 模块  
  29.         exec("path = os.getcwd()", mainNamespace, mainNamespace); //获得当前路径  
  30.         exec("print 'cur path is :', path", mainNamespace, mainNamespace); //打印当前路径  
  31.           
  32.         //e2.从命名空间中取出path变量  
  33.   
  34.         object path = mainNamespace["path"];    //取得变量path。  
  35.         string pathname = extract<string>(path); //转换成c++ string类型。  
  36.         cout<<"cur path is : "<< pathname << endl;  
  37.   
  38.         //注意:只有字典类型、表列、列表,才可以使用[]运算符,取得元素。  
  39.         //其余类型,这样使用会抛出异常。  
  40.   
  41.         //e3.间接执行方法。获取当前路径。  
  42.   
  43.         //以下3种方法均可以取得os模块。  
  44.         //object os = import("os");             //直接导入  
  45.         //object os = mainModule.attr("os");    //从main模块获得属性os模块  
  46.         object os = mainNamespace["os"];        //从字典中取出元素os模块  
  47.         object getcwd = os.attr("getcwd");      //获得getcwd方法  
  48.         object result = getcwd();               //执行getcwd方法  
  49.         string dir = extract<string>(result);   //转换结果为c++类型  
  50.         cout<<"cur path is : "<<dir<<endl;  
  51.   
  52.         //e4.判断文件是否存在  
  53.         object isfile = os.attr("path").attr("isfile");  
  54.         bool r = extract<bool>(isfile("testPython.cpp"));  
  55.         cout<<"file testPython.cpp exsit? "<<r<<endl;  
  56.   
  57.         //e5.操作list。  
  58.         object sys = import("sys");         //导入sys模块  
  59.         object paths = sys.attr("path");    //取出path属性  
  60.         string path0 = extract<string>(paths[0]);//获得path的第一个元素  
  61.         cout<<"sys path0 : "<<path0<<endl;  
  62.   
  63.         //e6.使用contains,判断序列中是否含有元素。  
  64.         bool haskey = bool(mainNamespace.contains("os"));//判断a是否在  
  65.         cout<<"mainNamespace haskey 'os' : "<<haskey<<endl;  
  66.   
  67.         bool hasvalue = bool(paths.contains(5));  
  68.         cout<<"paths has a value '5' : "<<hasvalue<<endl;  
  69.     }  
  70.     catch(...)  
  71.     {  
  72.         if (PyErr_Occurred())  
  73.             PyErr_Print();  
  74.     }  
  75.   
  76.     //Py_Finalize (); //不要调用Py_Finalize,因为boost库目前还不完善,有全局变量还未释放。  
  77.     system("pause");  
  78.     return 0;  
  79. }  

内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通网络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值