C++python混合编程经验.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
这个问题是在我尝试利用pygraphviz嵌入我的C++代码绘制二叉树的时候发现的.找了半天资料,这里我把几种常用的C++调用 PYTHON利用 boost.python 的方法作一个总结,希望能让别人少走弯路,因为有些内容还找不到中文文档,虽然都不难但是开始摸索 还是费时间的. ??? 我个人认为boost.python真的是非常的COOL,基本上不需要去学习那个看了就头大用着也不方便的python c api了,唯一的缺点 是目前相关的资料太少,甚至官网上也解释不够详细. ??? 前面我写了一篇python嵌入c++的入门文章包括安装和环境配置,介绍了如何利用 boost.python方便的传递C++代码中的参数,调用 python函数.boost.python入门教程 ----python 嵌入c++ ?这个boost.python官网上的tourial也有介绍. ? 首先第一种常用方式是 python::boost::exec #include?boost/python.hpp using?namespace?boost::python; ? //引入python解释器 ??Py_Initialize(); ??//引入__main__?作用域 ??object?main_module?=?import(__main__); ??object?main_namespace?=?main_module.attr(__dict__); ?exec(print(Hello?world!),?main_namespace); ?? ?//exec + python command string + 作用域 第二种方法是利用boost::python::object对象 第一种方法虽然很好但是不方便和C++交互数据,如传递C++中的数据作为参数给python函数,以及C++接受python执行函数后 的返回值. 那么怎么用object调用python函数呢,很简单看下面的代码就了解了. 我在simple.py中定义了函数 def foo(int i = 3):   return i + 2008 这样一个简单的函数, 通过将simple.py利用boost::python::exec_file将其引入到__main__作用域,我们在__main__.__dict__ 也就是main_namespace中取到命名为foo的函数对象,并将其转换成boost::python::object使用. 这里我们给这个object 同样命名为foo,调用foo(5)即调用python 函数foo(5)返回2013,注意在C++环境中要用extractint将这个值取到. ?object?simple?=?exec_file(simple.py,main_namespace,?main_namespace); ??object?foo?=?main_namespace[foo]; ??int?val?=?extractint(foo(5)); ??cout??Python?has?caculated?foo?as???val??endl; 和C++不同,python函数支持不定长参数和关键字参数,遇到这种情况如何调用呢? 如果是简单的foo(a,b,c)这样的python函数按照上面的形式调用即可,但是象foo(*args), foo(**kargs),foo(*args,**kargs) foo(n,**kargs)诸如此类的函数怎么在C++中利用boost::python::object调用呢?? ? 恩,这是本文的重点,先看下什么是不定长参数和关键字参数.我直接copy一下赖勇浩博客上的解释吧,非常的清晰. /lanphaday/archive/2009/05/08/4159346.aspx 不定参数 ????? 在 C/C++ 中,不定参数可以算得上一节提高篇的课程。因为它的 va_list、va_start和 va_end 等是侵入式的,理解起来并不容易;此外由于 C/C++ 都是静态强类型语言,在运行时数据并不携带类型信息,因此不定参数函数更像是一个调用协议,需要函数定义者和使用者之间通过文档、注释等方式进行沟通;或 者像 printf() 函数那样用 fmt 参数隐式指出参数类型,然后进行显式转型。 ????? 不定参数在 Python 中则简单得多。再回过头来年一下 C/C++,其实 va_list,完全是一个 tuple 实现,因为它可以持有不同数据类型的指针(通过void* 来实现)。得益于 Python 函数调用时的 boxing 和 unboxing 操作,Python 可以为不定参数的存取提供

文档评论(0)

dashewan + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档