- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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.hppusing?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)