使用boost 令python 使用C++对象

使用boost 令python 使用C++对象
python c api 能方便的将C函数导入到python
而包装c++ 类就不是很容易了  直接导出对象就更难了
用boost python能容易点  经过尝试总结了些方法
主要就是运用宏 BOOST_PYTHON_MODULE(pySample) 会自动产生一个initpySample 函数 在Py_Initialize()后调用 就可以转换c++对象到python 对象
register_ptr_to_python <  pSample  > (); 能将C指针(boost 建议使用智能指针对象)转换到python对象
我只是做了一小点尝试 对python c api 的掌握还很有限 下面的代码说明了如何导入c++对象
定义C++ 类 "sample.h"

#include  < boost / smart_ptr.hpp >
#include 
< boost / python.hpp >
class  sample
{
    
int  m_value;
public :
    
int  GetValue();
    
void  SetValue( int  v);
    
    sample(
int  v = 0 );
    
~ sample( void );
};
typedef boost::shared_ptr
< sample >  pSample;
实现sample类的方法 "sample.cpp"
#include  " sample.h "
#include 
< stdio.h >
sample::sample(
int  v):m_value(v)
{
}

int  sample::GetValue(){ return  m_value;}
void  sample::SetValue( int  v){m_value = v;}
sample::
~ sample( void )
{
    fprintf(stderr,
" Delete sample address is %x\n " , this );
}
测试 “main.cpp"
#include  " sample.h "

namespace  boost{ namespace  python{
BOOST_PYTHON_MODULE(pySample)
{
    class_
< sample > ( " sample " )
        .def(
" get " , & sample::GetValue)
        .def(
" set " , & sample::SetValue)
    ;
    
    register_ptr_to_python
<  pSample  > ();


}};


using   namespace  boost::python;
int  _tmain( int  argc, _TCHAR *  argv[])
{
    Py_Initialize();
    initpySample();
    
    
try
    {
        
object  main_module  =  import( " __main__ " );
        
object  main_namespace  =  main_module.attr( " __dict__ " );
        pSample ptr(
new  sample( 25 ));
        
        main_namespace[
" sample " ] = ptr;
        exec_file(
" sample.py " ,main_namespace,main_namespace);
        fprintf(stderr,
" print in c:%d %d\n " ,ptr -> GetValue(),ptr.use_count());
    }
    
catch (error_already_set  const   & )
    {
        PyErr_Print();
    }

    fprintf(stderr,
" Before finalize\n " );
    Py_Finalize();
    fprintf(stderr,
" After finalize\n " );
    
return   0 ;
}
python 脚本 "sample.py"
print   " print in python " ,sample.get()
print  sample
sample.set(
12345 )

你可能感兴趣的:(使用boost 令python 使用C++对象)