环境:
WinXP-SP3(chs) + VS2010-SP1(en-us) + boost 1.47.0 + python 2.7(ActivePython2.7 携带)
boost编译时,boost::python库编译为 stage debug release link=static runtime-link=shared
问题1:
python27 不认dll作为extension
解决方案:
project的output file 和 extension 都设置为 .pyd
问题2:
需要在导出类函数时,支持带指针的参数 (重头戏)
解决方案:
这个问题似乎网上没有一个完整的答案,零零碎碎的问题有一堆,但感觉都不到位,接下来我就给个方案吧。(我对boost::python也不熟,如有错误希望好言指正:) )
这里要说明二点:
1)这个例子既有传指针参数,又有返回指针对象,算是把boost::python两个典型问题囊括了。
2)return_opaque_pointer 是我查官方文档后得到的一个变通(官方推荐这里用 manage_new_object,但不管你编不编的过,反正我是编不过,在翻了Reference manual后看到了 opaque_pointer,看名字觉得有戏,就拿来用了。貌似opaque_pointer的严格性更低一点。编译通过,运行OK,反正就这样了)
WinXP-SP3(chs) + VS2010-SP1(en-us) + boost 1.47.0 + python 2.7(ActivePython2.7 携带)
boost编译时,boost::python库编译为 stage debug release link=static runtime-link=shared
问题1:
python27 不认dll作为extension
解决方案:
project的output file 和 extension 都设置为 .pyd
问题2:
需要在导出类函数时,支持带指针的参数 (重头戏)
解决方案:
这个问题似乎网上没有一个完整的答案,零零碎碎的问题有一堆,但感觉都不到位,接下来我就给个方案吧。(我对boost::python也不熟,如有错误希望好言指正:) )
1
#include
<
boost
/
python.hpp
>
2 #include < stdio.h >
3 using namespace boost::python;
4
5 struct World
6 {
7 void simpleHello( void )
8 {
9 printf( " this is simple hello\n " );
10 }
11 void hello( int * data)
12 {
13 printf( " World say hello :%d\n " , * data);
14 }
15 int * ready( void )
16 {
17 return new int ( 1234 );
18 }
19 };
20
21 BOOST_PYTHON_MODULE(sample)
22 {
23 class_ < World > ( " World " )
24 .def( " simpleHello " , & World::simpleHello)
25 .def( " hello " , & World::hello, arg( " data " ))
26 .def( " ready " , & World::ready, return_value_policy < return_opaque_pointer > ())
27 ;
28 }
2 #include < stdio.h >
3 using namespace boost::python;
4
5 struct World
6 {
7 void simpleHello( void )
8 {
9 printf( " this is simple hello\n " );
10 }
11 void hello( int * data)
12 {
13 printf( " World say hello :%d\n " , * data);
14 }
15 int * ready( void )
16 {
17 return new int ( 1234 );
18 }
19 };
20
21 BOOST_PYTHON_MODULE(sample)
22 {
23 class_ < World > ( " World " )
24 .def( " simpleHello " , & World::simpleHello)
25 .def( " hello " , & World::hello, arg( " data " ))
26 .def( " ready " , & World::ready, return_value_policy < return_opaque_pointer > ())
27 ;
28 }
这里要说明二点:
1)这个例子既有传指针参数,又有返回指针对象,算是把boost::python两个典型问题囊括了。
2)return_opaque_pointer 是我查官方文档后得到的一个变通(官方推荐这里用 manage_new_object,但不管你编不编的过,反正我是编不过,在翻了Reference manual后看到了 opaque_pointer,看名字觉得有戏,就拿来用了。貌似opaque_pointer的严格性更低一点。编译通过,运行OK,反正就这样了)