设为首页 收藏本站
查看: 1351|回复: 0

[经验分享] boost.python入门教程

[复制链接]

尚未签到

发表于 2015-4-22 12:09:43 | 显示全部楼层 |阅读模式
  boost.python 中 python 嵌入c++ 部分,网上找到的中文资料似乎都有些过时了,
  如 boost.python学习笔记 http://edyfox.codecarver.org/html/boost_python.html
  在boost.python版本2中,提供更加简洁易用的接口,我们可以使用从而

  代替原始的PyRun_SimpleString等等python c 转换api.
  
  关于python与C++混合编程,事实上有两个部分


  • extending   所谓python 程序中调用c/c++代码, 其实是先处理c++代码, 预先生成的动态链接库, 如example.so,  而在python代码中import example;即可使用c/c++的函数 .
  • embedding c++代码中调用 python 代码.
  两者都可以用 python c 转换api,解决,具体可以去python官方文档查阅,但是都比较繁琐.

  对于1,extending,常用的方案是boost.python以及swig.

  swig是一种胶水语言,粘合C++,PYTHON,我前面的图形显示二叉树的文章中提到的就是利用pyqt作界面,
  调用c++代码使用swig生成的.so动态库.
  而boost.python则直接转换,可以利用py++自动生成需要的wrapper.关于这方面的内容的入门除了boost.python
  官网,中文的入门资料推荐
  
用Boost.Python + CMake + wxPython构建跨语言GUI程序
  
  http://www.cppblog.com/skyscribe/archive/2009/08/09/92686.html
  一共3个系列吧,他的博客上还有cmake的内容,本文的环境也将使用cmake编译,可供参考.

  对于2 似乎swig就不提供支持了,swig 不仅仅支持 python调用c/c++,还支持许多其它高级语言调用c++, 但是它不支持python 嵌入c++.

  

  下面仅仅介绍2 embedding, 事实上embedding 比 extending 简单的多:)
  本将会给出具体实例代码以及环境配置方法.有些只是为了简单,并不是最好的配置方案,
  如cmake的使用.


  • 环境配置
  我的工作环境是ubuntu8.04,gcc4.24,cmake2.6,boost1.4,python2.6.
  如果你在windows下工作就不用往下看了.

  boost.python似乎还不支持python3 所以个人推荐使用python2.6,当然ubuntu8.04自带的python2.5
  也可以的.

  1.python2.6 的安装

  去官网下载python2.6,解压缩,
  ./configure --enable-shared;make; sudo make install
  头文件应该会默认安装到/usr/local/include/python2.6.
  注意第一步 ./configure --help可以查看帮助选项,如你想设置安装到什么路径,
  特别注意 --enable-shared选项生成动态链接库,libpython2.6.so
  这个是我们下面需要的一定要有这个选项! 默认会生成到/usr/local/lib下,你直接./configure
  的话则不会生成动态链接库.
  2. cmake  安装

  sudo apt-get insall cmake即可,也可以去官网下载安装最新的cmake2.8
  3. boost   安装

  去官网下载boost.1.4.2 解压缩
  ./bootstrap.sh  --help
  ./bootstrap.sh --show-libraries  #会显示你有哪些库可以安装
  这里解释一下,因为boost是模板库,很多都只需要头文件,不需要编译安装,但是有些库是需要安装的如
  regex,python, 等等,你可以查看一下选择自己需要安装的库.
  我选择了全部安装,默认是全部安装.

  ./bootstrap.sh --prefix=/usr/local/boost1.4
  这样会将头文件安装到 /usr/local/boost1.4/include
  库文件安装到 /usr/local/boost1.4/lib
  然后
  ./bjam install
  注意不加install的话文件不会拷贝到你指定的安装路径的.

  然后你可以设置一下环境变量,如BOOST_ROOT,BOOST_LIB
  下面我实验的时候直接写的安装路径,如 /usr/local/boost1.4/include

  • 直接用python,c 转换api 如何实现.
  看一个最简单的例子
  


#include
int
main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n");
Py_Finalize();
return 0;
}  假设这个程序命名为a.cc,如何编译它呢.无外乎要能找到python的头文件和动态链接库.如下:
  g++ -I /usr/local/include/python2.6 -lpython2.6 -o a a.cpp

  ./a
  Today is Sun Nov 15 17:25:25 2009


  • boost.python的支持  
  使用boost.python需要以下步骤
  


  • #include
  • 调用Py_Initialize()  来开启解释器 并且生成  _main_ 模块 .
  • 使用该解释器调用 Python C API .注意当前你一定不要最后调用Py_Finalize了结束解释器 ,这个问题可能会在以后版本中改掉. 当然你可以在这些步骤中有其它的C++代码.
     还是直接看代码吧,boost.python提供了3种调用python代码的方法,
  eval, exec, exec_file,
  分别对应

  计算表达式值,
  执行python语句,
  执行python 文本如a.py.
  而boost::python::object的使用,使得调用python中的函数异常的简单.
  下面的代码,演示了exec,exec_file,object的使用,基本上覆盖了所有常见的需求.
  首先写一个简单的python 文件 ,
  simple.py
  


def foo(i = 4):
  return i + 2008  
  写一个C++的代码
  embedding.cc
  

#include
using namespace std;
#include
using namespace boost::python;
int main(int argc, char *argv[])
{
  Py_Initialize();
  object main_module = import("__main__");
  object main_namespace = main_module.attr("__dict__");
  exec("hello = file('hello.txt', 'w')\n"
       "hello.write('Hello world!')\n"
       "hello.close()",
       main_namespace);
  exec("result = 5 ** 2", main_namespace);
  int five_squared = extract(main_namespace["result"]);
  cout

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59610-1-1.html 上篇帖子: Python中文全攻略【转】 下篇帖子: Selenium-解决使用Webdrive打开Firefox不含有插件的问题(python)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表