利用boost.python 通过c++语言来扩展python (python.boost)

python语言的优良性就不多说了,我想提下如何使用boost.python,通过boost.python既可以将python转移到C++上,通过Python库,也可以通过C++来扩展python,下面主要介绍使用boost.python来扩展python的功能,第一次用boost.python,倒腾了半天才搞定:

首先列出我的测试环境:

我用的是VS2010,python2.7,我用VS2010创建了一个windows DLL的项目,项目名称为pylib,在DLL main中加入如下代码:

//如果返回的不是const char*

//则需要在python函数对象定义的地方加上

//boost::python::return_value_policy<boost::python::return_opaque_pointer>()

//指明返回值的类型

char* greet()

{

return "hi extending python!";

}

BOOST_PYTHON_MODULE(greet_ext)

{

//由于我的返回值给的是char*,不是const char*,所以必须要对返回值策略进行说明,否则编译不过去

//这也是我碰到的第一个问题

boost::python::def("greet", greet, boost::python::return_value_policy<boost::python::return_opaque_pointer>());

}

然后我在编译好的release目录下创建了一个测试的py文件,用来测试脚本文件是否能正确加载,我的py脚本文件如下:

import pylib

print pylib.greet2()

运行python程序报DLL Load Failed,说明动态库加载失败,我查了一下原来是boost.python的动态库忘了放到编译执行目录下了。于是我从boost的编译目录下将

boost_python-vc100-mt-1_55.dll文件拷贝过来了,嘿嘿!果然不报这个错误了。但是让我吃惊的是又有一个问题来了,说找不到initpylib函数:(中间我各种折腾

的过程就不细说了),最终将问题锁定到模块的名称上,因为python是将文件名称作为模块名称,所以在到处的时候也必须如此,也就是说你最终编译生成的pyd文件

(其实就是动态库文件,只不过改成python能认识的后缀而已)的名称必须和你导出模块的名称保持一直,否则python认为该模块不能正确的进行加载。所以我把

BOOST_PYTHON_MODULE(greet_ext)

改成pyd的文件名称pylib:

BOOST_PYTHON_MODULE(pylib)

于是重新执行python的测试程序,OK,结果正确显示:

下面我简单的总结一下boost.python在使用过程中需要注意的问题:

1.动态库编译输出成*.pyd格式

2.保证该动态库所依赖的动态库python都可以找得到,最简单的就是将他们都放在一起就行。

3.保证BOOST_PYTHON_MODULE(模块名称) 指定的模块名称和动态库的文件名称保持一致

4.其他关于类等高级用法参考boost.python。

时间: 2024-10-07 14:39:22

利用boost.python 通过c++语言来扩展python (python.boost)的相关文章

Python:C语言扩展

1. 概述 Python 可以非常方便地和 C 进行相互的调用. 一般,我们不会使用 C 去直接编写一个 Python 的模块.通常的情景是,我们需要把 C 的相关模块包装一下,然后在 Python 中可以直接调用它.或者是,把 Python 逻辑中的某一效率要求很高的部分使用 C 来实现.整个过程大概是: 引入 Python.h 头文件. 编写包装函数. 函数中处理从 Python 传入的参数. 实现功能逻辑. 处理 C 中的返回值,包装成 Python 对象. 在一个 PyMethodDef

python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )

<python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )>http://blog.csdn.net/lainegates/article/details/19565823 目前有很多开源的Python/c++ 绑定工具,搜了好多岾子,这里稍微总结下. SWIG 支持 Python 2 and 3 配置正确的话,可以全自动完成封装(*.i文件需要自己写) 当不是全自动的时候,它大多会重复你的.h文件并给出提示 除了P

python和C语言混编的几种方式

Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Python虽有GIL的问题导致多线程无法充分利用多核,但后来的multiprocess可以从多进程的角度来利用多核,甚至affinity可以绑定具体的CPU核,这个问题也算得到解决.虽基本为全栈语言,但有的时候为了效率,可能还是会去考虑和C语言混编.混编是计算机里一个不可回避的话题,涉及的东西很多,技术.架

Python重写C语言程序100例--Part8

''' [程序61] 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: ''' if __name__ == '__main__': a = [] for i in range(10): a.append([]) for j in range(10): a[i].append(0) for i in range(10): a[i][0] = 1 a[i][i] = 1 for i in range(2,10): for j in range(1,i): a[i][j] = a[i

Python重写C语言程序100例--Part5

''' 程序31] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. 2.程序源代码: ''' from sys import stdin letter = stdin.read(1) stdin.flush() while letter != 'Y': if letter == 'S': print 'please input second letter

豆瓣的开发语言:无所不能的python

? ????面对珍珠(Perl)夺目之光.灵蛇(Python)更具有上天入地之能.它可以在 MS-DOS,Amiga,BeOS, OS/2,VMS,QNX等多种OS上运行:比 Perl 和 VB更快更好,比 C 和 C++ 语言更具扩充性:不仅在"星球大战". "星球之旅(Star Trek)"等超级大片中当纲特技和动画制作,还闯入了美国航天航空局控制室.真相如何,请看报道.? 对 Perl (珍珠) 语言,互联网开发人员可以说是无人不知.无人不晓:它运行迅捷.操作

Python重写C语言程序100例--Part4

''' [程序24] 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. 1.程序分析:请抓住分子与分母的变化规律. 2.程序源代码: ''' #方法一 a = 2.0 b = 1.0 s = 0 for n in range(1,21): s += a / b t = a a = a + b b = t print s #方法二 s = 0.0 for n in range(1,21): s += a / b b,a = a , a +

Python重写C语言程序100例--Part7

''' [程序51] 题目:学习使用按位与 & . 1.程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 2.程序源代码: ''' if __name__ == '__main__': a = 077 b = a & 3 print 'a & b = %d' % b b &= 7 print 'a & b = %d' % b ''' 题目:学习使用按位或 | . 1.程序分析:0|0=0; 0|1=1; 1|0=1; 1

Python重写C语言程序100例--Part3

''' [程序11] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 2.程序源代码: main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) { printf("%12ld %12ld",f1,f2); if(i%2==0) printf(&qu